- ベストアンサー
正規表現で一発置換できるでしょうか?
サイトにある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"> に変換/入替 といった処理で結果は正しく出ますがパフォーマンス的に痛いですよね。 このような検索置換処理を、正規表現を使って、一発でできないものでしょうか? (すみません、、正規表現よく分かっていません、、)
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
正規表現を使って一発でできますが 問題自体を変えてしまってこのような処理で解決してしまってはいかがでしょうか? $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>
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
#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)); ?>
お礼
フムフム。。何となく分かります(笑) アドバイスありがとうございます。 しかし正規表現って、奥が深いですねぇ。(^^);
- saintandre
- ベストアンサー率31% (194/607)
ちなみに正規表現ですとこんな感じです。 $body = preg_replace("/<a href=([^>]*)>/u","<a href=$1 target=\"_blank\">",$body); target属性が既についているものにも属性がついてしまう欠点はとりあえず無視しております。
お礼
ありがとうございます!
お礼
目から鱗です! そうですよね、、targetは、hrefの後ろに付かなくても機能するって事に気がついていませんでした! これでいきます!ありがとうございます!!