• ベストアンサー

正規表現を使用して、>から改行までを色変更したい

正規表現の扱いで困っております。 やりたいことは、BBSで返信記事を書く際に、「>~さんへ」または、「>~さんへ」となっていたらその部分を色変更したいのです。 下記を含めて何パターンか試行したのですが、文字列が化けてしまい上手くいきません…。 $str = preg_replace( "(^>.*?<br />|^&gt;.*?<br />|<br />>.*?<br />|<br />&gt;.*?<br />)", "<font color=RED>\1</font><br />", $str ); $str = mb_ereg_replace( "(^([&gt;>][^<]+)<br />|(<br />)+([&gt;>][^<]+)<br />)", "<font color=RED>\2\4</font><br />", $str ); (環境) ・Windows2000&XP ・PHP 4.3.11 どなたかこれなら上手くいくというパターンが解りましたら、ご教授頂けたら幸いです。 宜しくお願い致します。

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

  • ベストアンサー
回答No.3

とりあえずこんな感じで行けるかと思います。 mb_ereg_replace("((>|>|&gt;).*さんへ(<br[\\s\/]{0,}>|\\n))","<font color=RED>\\1</font>",$str); それと、置換元の文字列は既にhtmlspecialchars済みの文字列ですよね?だとすると">"は既に&gt;に置き換わっているでしょうから、これは不要かも知れません。 あと全角文字が含まれているので、スクリプトファイル自体がEUC-JPで書かれている必要があります、念のため。

Javac
質問者

お礼

ご回答有難うございます。 ご提示頂いたパターンを早速試してみます。 有難うございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

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

試してないのですが・ 「/」を「\/」にしてやらないといけないような気がしますが・ あと、置き換える側でも \1とか\2\4とかを \\1とか\\2\\4とかにしないといけないような気がします。

Javac
質問者

お礼

ご回答有難うございます。 そうですね…。ご指摘のとおりで。初歩的ミスでした。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

正規表現のパターンが正しいかどうかは検証してないんですが、内部エンコードは何になってますか?もしShiftJISですとmb関数群が正常に動かない場合があります。 内部エンコーディングをEUC-JPなどにする必要がありますが、この点はどうですか?

Javac
質問者

補足

ご回答ありがとうございます。 内部エンコーディングは、EUC-JPです。設置予定のサーバも同様です。 文字列が化けるのは、「>ALL」としてもバイナリのような文字となってしまうという意味です。恐らく、変換範囲の指定ミスかと思うのですが…。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • preg_replaceでの正規表現について

    お世話になります。 ereg_replace で書いた正規表現による置換処理を、 preg_replace に置き換えようとしています。 (preg_replaceの方が処理が速いとマニュアルにあったので) ところが、preg_replaceでの正規表現検索がうまくいかないで困っています。 基本的には、ereg_replaceの正規表現部分を//で囲んでいるだけです。 具体的には、下記のような処理を書いています。 間違いがあれば、ご指摘いただけましたら幸いです。 //### うまくいっている ereg_replace のパターン ここから ### $html=file_get_contents('template/temple.html'); //ひな形読み込み $search='\{dokuji tag\}.+\{_dokuji tag\}'; $replace=''; $html=ereg_replace($search,$replace,$html); //不要部分の削除 //### うまくいっている ereg_replace のパターン ここまで ### ↓ //### うまくいかない preg_replace のパターン ここから ### $html=file_get_contents('template/temple.html'); //ひな形読み込み $search='/\{dokuji tag\}.+\{_dokuji tag\}/m'; $replace=''; $html=preg_replace($search,$replace,$html); //不要部分の削除 //### うまくいかない preg_replace のパターン ここまで ### //### 置き換えるソース('template/temple.html') ここから ### <!-- {dokuji tag} --> <tr> <td nowrap><strong>タイトル:</strong></td> <td> <input type="text" name="name" size="80" value="{name}" /> </td> </tr> <!-- {_dokuji tag} --> //### 置き換えるソース('template/temple.html') ここまで ### よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 正規表現

    正規表現に疎いので質問させてください。 $param = ereg_replace('/?$', '', $_SERVER['REQUEST_URI']); これをpreg_matchで書くとどうなりますか? よろしくお願い致します。

    • 締切済み
    • PHP
  • php 正規表現で、\マークを取り除くには?

    php で ereg_replace関数を使って¥マークを取り除きたいのですが、 ereg_replace("\\", "",$str); と記述すると Warning: ereg_replace() [function.ereg-replace]: REG_EESCAPE in C:\xampp... とエラーになってしまいます。 どうすれば正規表現により円マークを取り除くことができるのでしょうか?

    • ベストアンサー
    • PHP
  • PHPの正規表現について

    // URLエンコード $str =~ s/([^\w ])/'%' . unpack('H2', $1)/eg; $str =~ tr/ /+/; これをPHPの関数を使った方法と使わなかった方法が知りたいです。 また、正規表現で、ereg.., preg.., mb_eregがありますが、この違いの詳細が知りたいです。

    • ベストアンサー
    • PHP
  • PHPの正規表現で【】内を文字列ごと削除

    あいうえお【かきく】けこさ。【しすせそ】 といった感じの文字列を、【かきく】や【しすせそ】を削除して、 ”あいうえお けこさ。” としたいのですが・・・ $str = preg_replace("【.*】"," ",$str) とすると、 あいうえお ってなっちゃうし、 $str = preg_replace("/【.{1,5}?】/"," ",$str) とかやってみても上手く行かず。 はて?「/」は何を意味するのだろう。とか思いながら試行錯誤してはみてるのですが・・・ どなたかご教授くださいませんでしょうか。 お願いします。

    • ベストアンサー
    • PHP
  • 正規表現の書き方について

    $a=aaaaaaあああ1111いいい2222; 上記の$aを <br>aaaaa<br>aあああ<br>1111いいい<br>22222<br> このようにしたいのですが、 条件1:半角英数字の頭に<br> 条件2:半角英数字が5つ続いたら<br> としたいのですが、正規表現の記述方法で悩んでいます。 $b=preg_match([a-zA-Z0-9],$a)がに該当したら これで受け取ったものをpreg_replace<br>で挟む?のでしょうか。 そもそも条件は1つ以上指定できないのかもしれませんが・・・。 何かご存知の方いましたらご教授お願いいたします。

    • ベストアンサー
    • PHP
  • 正規表現で置換

    その1 $str = "ほげほげほげ<a href="http://xxxx.xxxx.xxx/xxxx/">ほげほげほげ</a>ほげほげ<br /><br /><img src="http://yyy.hoge.jp/hage/hige/xxxx.jpg" width="320" height="240" />ほげほげ"; ↓ $str = "ほげほげほげ<a href="http://xxxx.xxxx.xxx/xxxx/">ほげほげほげ</a>ほげほげ<br /><br /><img src="./foo/faa/fii/xxx.jpg" width="320" height="240" />ほげほげ"; その2 $str = "<img src="http://yyy.hoge.jp/hage/hige/xxxx.jpg" width="320" height="240" />ほげほげほげ<a href="http://xxxx.xxxx.xxx/xxxx/">ほげほげほげ</a>ほげほげ<br /><br /><img src="http://yyy.hoge.jp/hage/hige/xxxx.jpg" width="320" height="240" />ほげほげ"; ↓ $str = "<img src="./foo/xxxx.jpg" width="320" height="240" />ほげほげほげ<a href="http://xxxx.xxxx.xxx/xxxx/">ほげほげほげ</a>ほげほげ<br /><br /><img src="./foo/faa/fii/xxx.jpg" width="320" height="240" />ほげほげ"; このような文字列があった時に、次のように従って置換したいです。 1.imgのタグの内部に、「http://yyy.hoge.jp/hage/hige/xxx.jpg」という文字列があった場合、「./foo/faa/fii/xxx.jpg」という文字列に置き換える。 2.それ以外のURLの場合は置換しない。 3.その1とその2では「xxx.jpg」となっていますが、jpg以外の拡張子の場合も存在する。 4.日本語とURLの位置や個数はバラバラです。 5.URLの中のxxxとyyyは不定の文字列で、hage、hoge、hige、foo、faa、fiiは固定です。 6.使用している言語はPHPです。正規表現を1度だけでできれば理想的ですが、今回は2回に渡った処理でも問題ありません。 以上です。正しく処理できる正規表現、あるいは下記の正規表現の誤りを教えて頂ければ幸いです。 お手数ですが、よろしくお願い致します。 下記の方法では、うまくできませんでした。 $pattern = "/http:\/\/.*?hoge.jp\//"; $replacement = "./"; $str= preg_replace($pattern, $replacement, $str); $pattern2 = '/\/?hage\/hoge/'; $str = preg_replace($pattern2, '/foo/faa/fii', $str);

    • ベストアンサー
    • PHP
  • php正規表現について

    こんばんは。夜遅くですが質問させていただきます。 正規表現に関する質問なんですが、仮に contents:yazirobee contents:gokuu contents:tyaozu contents:pikkoro contents:togasi という文字列があったとします。 この文字列の最後に<br />をつけたい場合、 例 contents:yazirobee<br /> contents:gokuu<br /> contents:tyaozu<br /> contents:pikkoro<br /> contents:togasi<br /> 正規表現ではどのように書けばいいでしょうか? ereg_replace("contents:.*","contents:.*<br />",$str) などとおけば、文字列自体が、contents:.*<br />となってしまいます。 pikkoro,tyaozuなどの文字列を崩さずに<br />を付加する方法を教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 正規表現を表示させたい

    今正規表現をしているのですが、どうやってブラウザーで表示できるのでしょうか?わかっている人にとってはめちゃくちゃくだらないことだと思うのですが、よろしくお願いします。下記のコードです。 <?php $str = "There is no pen . I want a pencil . "; ereg_replace("pen(cil)?", "pencil", $str ); ?>

    • ベストアンサー
    • PHP
  • 正規表現のコーディングについてお願いします。

    こんにちは、よろしくお願いいたします。 正規表現パターンを書く場合に皆さんがどのようにされているか教えてください。 例えば(ちょっとムリヤリ感が強いですが)、'Price \5800-' という文字列の \5800 の部分に preg_match でマッチさせたいとします。 単純に考えると、 /\\\d+/ のようなパターンが思いつくのですが、それを文字列として preg_match に渡す際に、コードはどのように書かれますか? <?php   $str = 'Price \5800-';   //とりあえず、'/\\\d+/' と書き、'/\\\\\\d+/' と、\ をそれぞれの \ に書き足す   if ( preg_match('/\\\\\\d+/', $str, $match) ) {     print_r($match);   } ?> 「まず、パターンを書き、全ての \ の前に \ を書き足す。」というのが無難なのかな?と思い、そうしていますが、 そういった考え方で間違っていないでしょうか? どうぞよろしくお願いいたします。

    • 締切済み
    • PHP