• ベストアンサー

正規表現で一発置換できるでしょうか?

サイトにあるHTMLを読み込み、その中のリンク全てに target指定を追加して表示するPHPについてアドバイスをお願いします。 取込元のHTMLは↓な記述(全リンクにtarget指定は無い)  … <a href="http://bakubaku.com">ばくばく</a> …  … <a href="http://mogumogu.net">もぐもぐ</a> …  … <a href="http://karikari.org">かりかり</a> … これを、↓のように変換して出力したい  <a href="http://bakubaku.com" target="_brank">ばくばく</a>  <a href="http://mogumogu.net" target="_brank">もぐもぐ</a>  <a href="http://karikari.org" target="_brank">かりかり</a> とりあえず、  ・<a href…> のリストを preg_match_allで 抽出  ・要素数だけ 末尾の > を target="_brank"> に変換/入替 といった処理で結果は正しく出ますがパフォーマンス的に痛いですよね。 このような検索置換処理を、正規表現を使って、一発でできないものでしょうか? (すみません、、正規表現よく分かっていません、、)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

正規表現を使って一発でできますが 問題自体を変えてしまってこのような処理で解決してしまってはいかがでしょうか? $body = str_replacer("<a href=","<a target=\"_brank\" href=",$body); つまり以下のように変換してしまうわけです。  … <a href="​http://bakubaku.com">​ばくばく</a> …  … <a href="​http://mogumogu.net">​もぐもぐ</a> …  … <a href="​http://karikari.org">​かりかり</a> … ↓  <a target="_brank" href="​http://bakubaku.com">ばくばく</a>  <a target="_brank" href="​http://mogumogu.net">もぐもぐ</a>  <a target="_brank" href="​http://karikari.org">かりかり</a>

goooide
質問者

お礼

目から鱗です! そうですよね、、targetは、hrefの後ろに付かなくても機能するって事に気がついていませんでした! これでいきます!ありがとうございます!!

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

#2さんの元からtargetが付いていた場合を想定するなら はずしてからつけるという処理でどうでしょう? <? $html=<<<eof <a href='http://www.example.com'>例1</a> <a href="http://www.example.com" class="hoge" id="fuga">例2</a> <a target="hoge" href="http://www.example.com">例3</a> <a href="http://www.example.com" target="hoge">例4</a> eof; print "元:<br>"; print nl2br(htmlspecialchars($html)); $pattern=Array("/target=.*?( |>)/","/(<a .*?)(>)/i"); $replacement=Array("$1","$1 target=\"_blank\"$2"); $html=preg_replace($pattern,$replacement,$html); print "先:<br>"; print nl2br(htmlspecialchars($html)); ?>

goooide
質問者

お礼

フムフム。。何となく分かります(笑) アドバイスありがとうございます。 しかし正規表現って、奥が深いですねぇ。(^^);

回答No.2

ちなみに正規表現ですとこんな感じです。 $body = preg_replace("/<a href=([^>]*)>/u","<a href=$1 target=\"_blank\">",$body); target属性が既についているものにも属性がついてしまう欠点はとりあえず無視しております。

goooide
質問者

お礼

ありがとうございます!

関連するQ&A