ここから<a href="">ここまで</a>を<img src="x.gif" alt="ここ画像" />ここのように
を
<a href="x.html">ここ</a>から<a href="">ここまで</a>を<img src="x.gif" alt="ここ画像" /><a href="x.html">ここ</a>のように
とする置き換えるコードを教えて下さい。
「ここ」をリンクにしたいのですが、aタグの中と、alt属性の値部分は置き換えないようにしたいのです。
よろしくお願いします。
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); ?>
一例
<?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>のように
ありがとうございます。
弱点の箇所については、
alt="ここ画像" があったのでわざと < を省いています。
alt="ここ画像"の記述がないのであれば下記のように < を加えます。
$p = array( '!ここ!', '!(<a.+?)<a href="x.html">ここ</a>!' );
実際のテキストはもっと複雑でしょうから、
自身で修正しやすいように、
簡単な正規表現で出来ることを考慮しています。
コメントすると改行位置で変な文字が混じるので一行に書き直しました。
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); ?>
ありがとうございます。
これから試してみます。
上手く行きました!
ありがとうございました。
ありがとうございます。
2012/06/18 19:54:26これから試してみます。
上手く行きました!
2012/06/18 20:39:59ありがとうございました。