あるマルチバイト文字列に対して、特定の文字を正規表現で置換したいのです。
そのマルチバイト文字列には、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;
=================================================
是非、皆様に力を貸して頂きたく、どうぞ宜しくお願い致します。
No.1
- 回答日時:
一度にやらずに分けてやってみたらどうでしょう
$string = '朝一番のコーヒーは<a href="index.html">3時のコーヒーや</a>食後のコーヒーより旨い';
$string = mb_ereg_replace('コーヒー', '紅茶', $string);
$result = mb_ereg_replace('(>.*?)紅茶(.*?<)', '\1コーヒー\2', $string);
echo $result;
この回答への補足
回答ありがとうございます。
2回に分けるとは、なるほど思いつきませんでした。
しかし、例題のケースでは出来ますが、もともと<a>タグの中に「紅茶」という単語があると、それが「コーヒー」に変わってしまいますね。
うーむ、難しいですね。
No.2
- 回答日時:
#1>もともと<a>タグの中に「紅茶」という単語があると、それが「コーヒー」に変わってしまいますね。
そういう置換が予見される場合には、
まず、<a>タグの中の「紅茶」を%RED_TEA% などに置き換えてから作業し、後で戻します。
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 の初期化式間違ってますよ。
# この場合、文字列内のダブルクォートはエスケープしなければなりません。
回答ありがとうございます。
上記のようにしてみましたが、戻り値が
"朝一番の紅茶"
でした。
今回のケースはphp4ではちょっと難しいようです。
php5なら出来そうなのですが、、、
とても参考になりました。
皆様ありがとうございました。
No.4
- 回答日時:
結局、「aタグの内部には他のタグは含まれていない」という前提は正しかったのでしょうか?
> 上記のようにしてみましたが、戻り値が "朝一番の紅茶" でした。
変ですね…。
私が使用しているPHPは、Version 4.4.2 ですが、以下の文字列が返ってきています。
朝一番の紅茶は<a href='index.html'>3時のコーヒーや</a>食後の紅茶より旨い
#3で示したコードのみで実験しました。
他のコードが影響している、ということはないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) 正規表現の置換で一部の文字列をそのまま残したい 2 2022/05/03 19:19
- その他(プログラミング・Web制作) テキストエディタで複数行にわたる文字列の行頭に番号を振る方法 4 2023/03/11 12:57
- Visual Basic(VBA) Excel VBAでAA(BBB) → BBB.AA に置換したい 2 2022/10/30 13:59
- Visual Basic(VBA) Excel VBA 教えてください。 VBA初心者です。 詳しい方がいましたら教えてください。 下記 3 2023/04/25 11:22
- Excel(エクセル) 数式の置換がうまく行かない 6 2022/05/04 15:51
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- フリーソフト サクラエディタの正規表現(grep機能)の使い方 3 2022/06/22 10:29
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
csobjというタグについて
-
正規表現でHTMLタグの属性まで...
-
reuterの記事をbeautiful.soup....
-
HTML・特定のタグの使用可能か...
-
objective-cでのHTMLタグ表示に...
-
VBAのコマンドボタンの文字列の...
-
テキストファイルから改行コー...
-
C++で空Enterの入力を判...
-
LaTeX: captionの中で改行した...
-
VC++ マルチバイト文字とUniCod...
-
JAVA System.out.println の ...
-
fgetsとsscanf
-
エスケープ文字の復帰(¥r)と...
-
VBAでCSVをExcelに取り込む時に...
-
VB.net テキストボックス半角文...
-
VB6でブラウザのページソースを...
-
C++のctime関数復帰値の改行
-
正規表現での英字+ハイフンの...
-
エクセルのCOUNTIFが正しくカウ...
-
【Tex】\\verbatiminputについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
reuterの記事をbeautiful.soup....
-
JSFタグのfタグとは
-
正規表現で複数行に渡る範囲を...
-
変数にHTMLを代入する場合
-
phpの正規表現でstyle="●●"を削...
-
Nvuで作成したhtmlをコピペして...
-
正規表現で指定範囲すべて除去...
-
正規表現でタグの置換をしたい...
-
Strutsでリンクを動的に生成したい
-
自分でタグ打ちして作ったペー...
-
php正規表現 相対パス→絶対パス
-
ASP.NET(C#)とhtmlの#include
-
PHPの正規表現でHTMLタグの内容...
-
csobjというタグについて
-
VBSでのhtmlタグ要素名の置換
-
htmlタグ間の特定文字置換
-
URLの連続アクセス
-
HTMLファイルの書き換え
-
htmlspecialchars関数を使いな...
-
javascriptの正規表現でhtmlか...
おすすめ情報