• ベストアンサー

タグにはさまれている文字以外を置換したい

あるマルチバイト文字列に対して、特定の文字を正規表現で置換したいのです。 そのマルチバイト文字列には、htmlの<a>タグが混じっています。(混じっていない場合もあります。) 置換したいのは、<a>タグで囲まれている文字以外の文字なのですが、正規表現としてどのようなパターンにすれば出来るのか悩んでおります。 ------------------------------------------------- //置換前のマルチバイト文字列 "朝一番のコーヒーは<a href="index.html">3時のコーヒーや</a>食後のコーヒーより旨い" //検索・置換対象となる文字列 "コーヒー" //置換を行う文字列 "紅茶" //置換後のマルチバイト文字列 "朝一番の紅茶は<a href="index.html">3時のコーヒーや</a>食後の紅茶より旨い" ------------------------------------------------- ↓こちらを参考にしてみたのですが、ちょっとやりたいことと違うみたいでうまくいきませんでした。 http://www.din.or.jp/~ohzaki/regex.htm#ReplaceOutside ================================================= $string = "朝一番のコーヒーは<a href="index.html">3時のコーヒーや</a>食後のコーヒーより旨い" $pattern = '/((?:\G|>)[^<]*?)コーヒー/'; $result = mb_ereg_replace($pattern, '\1紅茶', $string); echo $result; ================================================= 是非、皆様に力を貸して頂きたく、どうぞ宜しくお願い致します。

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

  • ベストアンサー
  • aqucent
  • ベストアンサー率39% (78/200)
回答No.3

1つ確認です。 「aタグの内部には他のタグは含まれていない」という前提でよろしいですか? 例えば、 "朝一番のコーヒーは<a href="index.html"><strong>3時のコーヒーや</strong></a>食後のコーヒーより旨い" が許可されていると、対応策が変わってきますので…。 とりあえず、「aタグの内部には他のタグは含まれていない」という前提の元で話を進めます。 $string = "朝一番のコーヒーは<a href='index.html'>3時のコーヒーや</a>食後のコーヒーより旨い"; $pattern = 'コーヒー(?![^<]*</a>)'; $result = mb_ereg_replace($pattern, '紅茶', $string); echo $result; "コーヒー" の前を見るコードでも良いのですが、後ろを見た方がシンプルに出来ます。 (前を見ると、(^|<a [^>]*>[^<]*) をみなければならくなり、コードが煩雑になります。) # それと、$string の初期化式間違ってますよ。 # この場合、文字列内のダブルクォートはエスケープしなければなりません。

sisyou
質問者

お礼

回答ありがとうございます。 上記のようにしてみましたが、戻り値が "朝一番の紅茶" でした。 今回のケースはphp4ではちょっと難しいようです。 php5なら出来そうなのですが、、、 とても参考になりました。 皆様ありがとうございました。

その他の回答 (3)

  • aqucent
  • ベストアンサー率39% (78/200)
回答No.4

結局、「aタグの内部には他のタグは含まれていない」という前提は正しかったのでしょうか? > 上記のようにしてみましたが、戻り値が "朝一番の紅茶" でした。 変ですね…。 私が使用しているPHPは、Version 4.4.2 ですが、以下の文字列が返ってきています。 朝一番の紅茶は<a href='index.html'>3時のコーヒーや</a>食後の紅茶より旨い #3で示したコードのみで実験しました。 他のコードが影響している、ということはないでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1>もともと<a>タグの中に「紅茶」という単語があると、それが「コーヒー」に変わってしまいますね。 そういう置換が予見される場合には、 まず、<a>タグの中の「紅茶」を%RED_TEA% などに置き換えてから作業し、後で戻します。

sisyou
質問者

お礼

なるほど。 今回はとても参考になりました。 どうもありがとうございます。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

一度にやらずに分けてやってみたらどうでしょう $string = '朝一番のコーヒーは<a href="index.html">3時のコーヒーや</a>食後のコーヒーより旨い'; $string = mb_ereg_replace('コーヒー', '紅茶', $string); $result = mb_ereg_replace('(>.*?)紅茶(.*?<)', '\1コーヒー\2', $string); echo $result;

sisyou
質問者

補足

回答ありがとうございます。 2回に分けるとは、なるほど思いつきませんでした。 しかし、例題のケースでは出来ますが、もともと<a>タグの中に「紅茶」という単語があると、それが「コーヒー」に変わってしまいますね。 うーむ、難しいですね。

関連するQ&A