• ベストアンサー

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

あるマルチバイト文字列に対して、特定の文字を正規表現で置換したいのです。 そのマルチバイト文字列には、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; ================================================= 是非、皆様に力を貸して頂きたく、どうぞ宜しくお願い致します。

  • PHP
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • 文字列の置換

    お世話になります。 このような文字列置換可能でしょうか '&nbsp;&nbsp;|&nbsp;&nbsp;<a href=・・・>(・・・' ・・・は、任意の文字列 を '&nbsp;&nbsp;<a href=・・・>(・・・' と、いうようにです。 つまり、文字列の中に'|&nbsp;&nbsp;'と、'('が有ったら、 '|&nbsp;&nbsp;'のみを取り除いた文字列を作成する と、いうことです。 そして、文字列中に同様なパターンが複数回有れば、同時に全てを同様に処理したいのですが。 よろしくお願いいたします。

  • htmlタグ間の特定文字置換

    お世話になります。 特定のタグに囲まれたテキスト部分の特定文字列を置換したいと思うのですが なかなか解決策が浮かばず困っています。 例えば $str = <<< EOM <a href="watanabe/nakamura/test.html" alt="watanabesan">これがwatanabeですよ</a> <a href="watanabe/nakamura/test.html" alt="nakamurakun">これがnakamuraですよ</a> EOM; という文字列があります このaタグ間のテキスト部分の「watanabe」と「す」にだけ()を付けたい場合 どうすればいいでしょうか? 希望の結果 --- <a href="watanabe/nakamura/test.html" alt="watanabesan">これが(watanabe)で(す)よ</a> <a href="watanabe/nakamura/test.html" alt="nakamurakun">これがnakamuraで(す)よ</a> --- 単純に置換しただけではタグ内の該当文字列も置換されてしまい困っています foreach (array("watanabe","す") as $keyword){ $str = eregi_replace($keyword,'('."\\0".')',$str); } --- <a href="(watanabe)/nakamura/test.html" alt="(watanabe)san">これが(watanabe)で(す)よ</a> <a href="(watanabe)/nakamura/test.html" alt="nakamurakun">これがnakamuraで(す)よ</a> --- 正規表現を使ってタグ内の文字を抽出という方法も考え抽出は出来たのですが 置換をかけてタグ間に戻す所でつまずいてしまいました。 何か良い方法はありますでしょうか? アドバイスよろしくお願いします。

    • ベストアンサー
    • PHP
  • preg_replaceでタグだけ置換

    HTMLのタグを別のタグに置換しようとしています。 HTML中に複数ある<a></a>タグ <a href="/w/index.php?title=%E3%83%95%E3%82%B0%E3%83%AA%E3%83%BC%E5%B7%9D&amp;action=edit" class="new" title="フグリー川">フグリー川</a>など という文字列の<a></a>タグを<span style="color:#ff0000;"></span>に置換したいのです。 $pattern = '|<a href="/w/index\.php\?title=.*?">(.*)</a>|'; $replace = '<span style="color:#ff0000 ;">\\1</span>'; preg_replace( $pattern, $replace, $html, -1, $count); print $count; $countの表示は 1 でした。上記のような<a>タグは複数あるのに。 上記のような<a>タグをマッチさせるにはどうパターン表記したらいいでしょうか? PHP5.2.4です。 ご教授お願いします。

    • ベストアンサー
    • PHP
  • jqueryで文字列を置換したいのですが。

    jqueryで文字列を置換したいのですが。 例えば<a href="http://*****/database.cgi?keys10=検索文字01"> みたいなアンカーがあったとして、これの”検索文字”の部分のみを置換して 例えば<a href="http://*****/database.cgi?keys10=検索文字02"> の様に置換することは可能でしょうか。 何卒、宜しくお願いいたします<m(_ _)m>

  • 任意の文字列で囲まれていない任意の文字列を置換するには

    任意の文字列で囲まれていない任意の文字列を置換したいです。 たとえば、『 [[ 』と『 ]] 』で囲まれていない『http://hogehoge/』を『<a href="http://hogehoge/">http://hogehoge/</a>』に置き換えるにはどうすればいいのでしょうか。 具体的には下記の【置換前】のテキストを【置換後】のような感じにしたいです。 【置換前】 http://hogehoge/ [[http://hogehoge/]] http://hogehoge/ http://hogehoge/ [[http://hogehoge/]] 【置換後】 <a href="http://hogehoge/">http://hogehoge/</a> [[http://hogehoge/]] <a href="http://hogehoge/">http://hogehoge/</a> <a href="http://hogehoge/">http://hogehoge/</a> [[http://hogehoge/]] preg_replaceかereg_replaceのどちらかで例を挙げてもらえるとありがたいです。ご教示お願いします。

    • ベストアンサー
    • PHP
  • タグ内を除く文字列置換

    ある特定文字を、HTMLの任意のタグ「<xxx>」を除いた範囲で置換をしたい場合はどのような正規表現で表すことができるでしょうか? たとえば以下のようなHTMLコードがあり、 <a href="http://google.ne.jp"><img src="./google.png"> google </a> このgoogleというテキスト部分の文字をyahooに置換したい場合は、 <a href="http://google.ne.jp"><img src="./google.png"> yahoo </a> となってほしいです。上の例に限らず、どんなHTMLにも適用できるような汎用性のある方法はないでしょうか。 自分で考えてみたのですが、タグを一旦抜き取って、代わりの記号を置き、置換後に元に戻すと言う方法くらいしか思いつきません。

    • ベストアンサー
    • Perl
  • ページ全体を検索して特定文字列を置換する

    まず初めに、ASPカテゴリでも同様の質問をしています。 もしかしたらJavaScriptの方が実現が容易かもしれない、と思いこちらでも質問させて頂くことにしました。 もしマナー違反であるのならば指摘して下さい。 本題ですが、ページ全体を検索して特定の文字列を置換したいのです。 例えば、Index.htmlというページの中から「管理」という文字列を検索し、「<a href=***.html>管理</a>」というように置換したいです。

  • 特定の文字列を含むテキスト置換について

    HTML編集で困っているのでお教え下さい。 ある特定の文字列を含む内容の一部を置換したいのですが、 正規表現の使用できるエディタで作業は可能でしょうか。 例としましては <a href = "xxx/xxx/xxx.pdf> <a href = "yyy/yyy/yyy.html> のような表記で、「pdf」を含む文字列のみ <a onclick href = "xxx/xxx/xxx.pdf> と置換したいのですが。よろしくお願いいたします

  • Perl 特定のタグ内を置換しない

    恐れ入ります。特定のhtmlタグ具体的には<h3></h3>タグないの文字列だけを除いて置換を掛けたいのですがなかなかうまくいきません。 $temp = s/[^<h3>(.+?)<\/h3>]$mojiretu1/<a href="$mojiretu2">リンク先</a>/; とした場合、<h3>タグ内の置換はされないようですが、置換後のリンク先の先頭部分が文字化けを起こしてしまいます。原因が分かる方いらっしゃいましたらご教授いただけたら助かります。 よろしくお願いいたします。

  • sed で \ を含む文字列に置換

    現在、非常に多数のドキュメントの整形を LaTeXを使って自動的に行っています。 問題となっている処理のエッセンスを抜き出すと次のようなもので、テンプレートファイル中の __PATTERN__ という文字列を、その都度指定する文字列($string)に置換した後にplatexでコンパイルする、という流れです。 ---------- #!/bin/bash sed "s/__PATTERN__/$string/" < template.tex > document.tex platex document.tex ---------- 問題は、$string に '_'(アンダーバー)が含まれるケースで、platexのコンパイルでエラーが発生します。 これを回避するには、'_' を '\_' に置換する必要がありますが、上記処理の前に、$string 中の '_' を '\_' に置換する処理を加えても、上記処理の段階で '\' が消えてしまいます。 肝は sed でのエスケープのやり方だと思うのですが、どうにもうまく行きませんので、お知恵を拝借できればと思います。 なお、tex ファイル中、__PATTERN__ は、他のコマンドの引数内で使用されているため、\verb+ + で囲むという手段も使えません。

専門家に質問してみよう