一例
<?php // データ準備 $t = 'ここから<a href="">ここまで</a>を<img src="x.gif" alt="ここ画像" />ここのように'; // 置換パターン準備 $p = array( '!ここ!', '!(a.+?)<a href="x.html">ここ</a>!' ); $r = array( '<a href="x.html">ここ</a>', '$1ここ' ); // 置換と出力 echo preg_replace($p, $r, $t); //下記と同じ意味になっています。 echo preg_replace('!(a.+?)<a href="x.html">ここ</a>!', '$1ここ', preg_replace('!ここ!', '<a href="x.html">ここ</a>', $t ) );
出力結果
<a href="x.html">ここ</a>から<a href="">ここまで</a>を<img src="x.gif" alt="ここ画像" /><a href="x.html">ここ</a>のように
▽2
●
TransFreeBSD ●80ポイント ベストアンサー |
http://ideone.com/SdAOd
基本は「(<a.*?<\/a>)|(ここ)」と同じですが、ちょっと改良したのと、「<.*?\>」(phpなので念のため>をエスケープしてます)というパターンを追加してます。
「<a.*?<\/a>」は「<(a)\b.*?<\/\3>」とすることで
となってます。二つ目は不要かもしれませんが、たとえばコメントアウトしてあるやつのように、「(a)」を「(a|textarea)」とすればaタグ以外にtextareaタグに囲まれている部分も置換しなくなります。
追加したパターンが「<.*?\>」なので
実用的にはこちらの方だろうと思います。もしimgに限定したいなら「<img\b.*?\>」になります。
あと、修飾子eに加えてiも指定してるので、タグが大文字でも対応します。
#面倒なので<>はすべて<>に変換してます。
<?php $path = "x.html"; $string = fgets(STDIN); $patterns = '!(ここ)|(<(a)\b.*?</\3>|<.*?\>)!ie'; //$patterns = '!(ここ)|(<(a|textarea)\b.*?</\3>|<.*?\>)!ie'; $replace = '"\1"?"<a href=\"$path\">\1</a>":"\2"'; echo preg_replace($patterns, $replace, $string); ?>