• ベストアンサー

【PHP】preg_replace() で正規表現が正常に動かない?

PHP5利用者です。 preg_replace() が思い通りに動かないため困っています。 マルチバイト文字及び正規表現を使おうとした場合動作がおかしいのです。例えば、 「 . 」は任意の1文字とされていますが、 $str = preg_replace("/第.回/", "第3回", "今日は第*回目です。"); 等と書いても何も置換されません。 これは一体どういうことなのでしょうか? 文字コードはUTF-8です。 お詳しい方、よろしくお願いいたします。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

> $str = preg_replace("/第.回/", "第3回", "今日は第*回目です。"); preg_replace に渡すパターンに u フラグをつけておかないと 渡されたデータがUTF-8であるとは認識されません。 したがって、 '.' は一文字ではなく一バイトにマッチすることになってしまいます。

ikataro
質問者

お礼

ありがとうございます。 「u フラグ」 というのが専門書に載っていないのですが、具体例を書いていただけませんでしょうか? よろしくお願いいたします。

ikataro
質問者

補足

<この回答へのお礼 の続き> わかりました。「u」は / / の後に書くのですね。 $str = preg_replace("/第.回/u", "第3回", "今日は第*回目です。"); 解決しました。 ありがとうございました。

その他の回答 (2)

  • yexob328
  • ベストアンサー率25% (1/4)
回答No.2

すみません。 文字コードはUTF-8とのことですのでマルチバイト対応のほうは mb_regex_encoding ('UTF-8'); $str3 = mb_ereg_replace("第.回", "第3回", "今日は第*回目です。"); でした。

  • yexob328
  • ベストアンサー率25% (1/4)
回答No.1

検索対象の文字*がマルチバイトなので、任意の一文字には一致ないのではないでしょうか。 以下のどちらかに変更すると置換されると思います。 (1)任意の1文字以上に一致させる preg_replace("/第.+回/", "第3回", "今日は第*回目です。"); (2)マルチバイト対応の処理にする mb_regex_encoding ('SJIS'); mb_ereg_replace("第.回", "第3回", "今日は第*回目です。");

ikataro
質問者

お礼

すみません、mb_ereg_replace() ならできるのは知っているのですが今回preg_replace() での疑問ということで… 説明不足申し訳ありませんでした。

関連するQ&A