• ベストアンサー

正規表現に関して

httpがついていないリンクだけに絶対パスをつけたいのですがなかなかうまくいきません。 $data='<a href="1_4/abc.jpg">abc</a> <a href="aiueo/abc.jpg">abc</a> <a href="http://www.●●●.co.jp/4/123.jpg">123</a> '; 以上を↓に <a href="http://www.test.com/1_4/abc.jpg">abc</a> <a href="http://www.test.com/aiueo/abc.jpg">abc</a> <a href="http://www.●●●.co.jp/4/123.jpg">123</a> preg_replace ('/(href=\")+^(http)+?/mi','=\"http:\/\/test\.com\/',$data); で駄目でした。 宜しくお願い致します。

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

  • ベストアンサー
noname#244856
noname#244856
回答No.4

「この投稿は、現在サポートで確認中のため、回答は他の方には表示されなくなっております。」が出てしまいました>< ついでに補足入れておきます。 $data = preg_replace('@<a href="\K(?![a-z-]++:/*+)@i', 'http://example.com/', $data); まず、デリミタは「/」である必要はありません。ここでは見やすいように「@」を用いました。 次にHTMLタグの開始「<」からマッチングを開始しています。これがないと文中に普通に登場した「href」という文字列に反応してしまうからです。 そして、マッチング開始位置リセットを表す「\K」を使っています。これはPHP5.2.4以降で使用可能で、出来ることとしては肯定先読み (?=...) と少し重複しますが、こちらを使ったほうが可読性が向上する上にパフォーマンスもよくなるので、私は頻繁に採用しています。 そこから否定戻り読み (?!...) を用いて「...に続かない」という設定にします。ここで除外対象にするのは [a-z-]++:/*+ にマッチする文字列、つまり http:// ftp:// mailto:// file:/// view-source:// などです。戻り読みでは登場回数不定な表現は使えなかったと思いますが、先読みでは問題なく使えます。独占的最長マッチ「++」「*+」は通常の最長マッチ「+」「*」と違ってバックトラックを行わないものであり、ここではバックトラックを行う必要がないのでパフォーマンス向上のために利用することにしています。

kenken8378
質問者

お礼

解決です! わかりやすいですね。 ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (3)

noname#244856
noname#244856
回答No.3

どうせならここまでやっちゃいましょうか・・・w <?php $data = <<<EOD <a href="1_4/abc.jpg">abc</a> <a href="aiueo/abc.jpg">abc</a> <a href="http://www.●●●.co.jp/4/123.jpg">123</a> <a href="ftp://www.●●●.co.jp/4/123.jpg">123</a> <a href="mailto:email123@example.com">123</a> EOD; $data = preg_replace('@<a href="\K(?![a-z-]++:/*+)@i', 'http://example.com/', $data); echo $data;

すると、全ての回答が全文表示されます。
  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.2

否定先読みを使うべきですね。 置換前:「href="」 置換後:「href="http://www.test.com/」 除外1:「href="http」 除外2:「href="/」 (この考慮が抜けてる気がします) 正規表現 href="(?!http|/) PHP風の記述ならば、 '#href="(?!http|/)#' 参考(実に参考になります) http://www.kt.rim.or.jp/~kbk/regex/regex.html#NEGATIVELOOKAHEAD 余談ですが、 ftp:とかmailto:とかjavascript:とかfile:とかの考慮は大丈夫ですか?

kenken8378
質問者

お礼

ftp:とかmailto:とかjavascript:とかfile:は現在の所大丈夫です。 助かりました!ありがとうございます。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「前方不一致」を使うんだろうなぁ.

kenken8378
質問者

お礼

回答ありがとうございます。

すると、全ての回答が全文表示されます。