最大1万円超分の電子書籍プレゼント♪

あるマルチバイト文字列に対して、特定の文字を正規表現で置換したいのです。
そのマルチバイト文字列には、htmlの<a>タグが混じっています。(混じっていない場合もあります。)
置換したいのは、<a>タグで囲まれている文字以外の文字なのですが、正規表現としてどのようなパターンにすれば出来るのか悩んでおります。

-------------------------------------------------
//置換前のマルチバイト文字列
"朝一番のコーヒーは<a href="index.html">3時のコーヒーや</a>食後のコーヒーより旨い"

//検索・置換対象となる文字列
"コーヒー"

//置換を行う文字列
"紅茶"

//置換後のマルチバイト文字列
"朝一番の紅茶は<a href="index.html">3時のコーヒーや</a>食後の紅茶より旨い"
-------------------------------------------------

↓こちらを参考にしてみたのですが、ちょっとやりたいことと違うみたいでうまくいきませんでした。
http://www.din.or.jp/~ohzaki/regex.htm#ReplaceOu …

=================================================
$string = "朝一番のコーヒーは<a href="index.html">3時のコーヒーや</a>食後のコーヒーより旨い"
$pattern = '/((?:\G|>)[^<]*?)コーヒー/';
$result = mb_ereg_replace($pattern, '\1紅茶', $string);
echo $result;
=================================================

是非、皆様に力を貸して頂きたく、どうぞ宜しくお願い致します。

gooドクター

A 回答 (4件)

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 の初期化式間違ってますよ。
# この場合、文字列内のダブルクォートはエスケープしなければなりません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
上記のようにしてみましたが、戻り値が

"朝一番の紅茶"

でした。

今回のケースはphp4ではちょっと難しいようです。
php5なら出来そうなのですが、、、
とても参考になりました。
皆様ありがとうございました。

お礼日時:2006/08/02 22:53

結局、「aタグの内部には他のタグは含まれていない」という前提は正しかったのでしょうか?



> 上記のようにしてみましたが、戻り値が "朝一番の紅茶" でした。
変ですね…。
私が使用しているPHPは、Version 4.4.2 ですが、以下の文字列が返ってきています。

朝一番の紅茶は<a href='index.html'>3時のコーヒーや</a>食後の紅茶より旨い

#3で示したコードのみで実験しました。
他のコードが影響している、ということはないでしょうか?
    • good
    • 0

#1>もともと<a>タグの中に「紅茶」という単語があると、それが「コーヒー」に変わってしまいますね。


そういう置換が予見される場合には、
まず、<a>タグの中の「紅茶」を%RED_TEA% などに置き換えてから作業し、後で戻します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/08/02 22:50

一度にやらずに分けてやってみたらどうでしょう


$string = '朝一番のコーヒーは<a href="index.html">3時のコーヒーや</a>食後のコーヒーより旨い';
$string = mb_ereg_replace('コーヒー', '紅茶', $string);
$result = mb_ereg_replace('(>.*?)紅茶(.*?<)', '\1コーヒー\2', $string);
echo $result;

この回答への補足

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

2回に分けるとは、なるほど思いつきませんでした。

しかし、例題のケースでは出来ますが、もともと<a>タグの中に「紅茶」という単語があると、それが「コーヒー」に変わってしまいますね。

うーむ、難しいですね。

補足日時:2006/08/02 11:56
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

gooドクター

人気Q&Aランキング