- ベストアンサー
【PHP】preg_replace() で正規表現が正常に動かない?
PHP5利用者です。 preg_replace() が思い通りに動かないため困っています。 マルチバイト文字及び正規表現を使おうとした場合動作がおかしいのです。例えば、 「 . 」は任意の1文字とされていますが、 $str = preg_replace("/第.回/", "第3回", "今日は第*回目です。"); 等と書いても何も置換されません。 これは一体どういうことなのでしょうか? 文字コードはUTF-8です。 お詳しい方、よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> $str = preg_replace("/第.回/", "第3回", "今日は第*回目です。"); preg_replace に渡すパターンに u フラグをつけておかないと 渡されたデータがUTF-8であるとは認識されません。 したがって、 '.' は一文字ではなく一バイトにマッチすることになってしまいます。
その他の回答 (2)
- yexob328
- ベストアンサー率25% (1/4)
すみません。 文字コードはUTF-8とのことですのでマルチバイト対応のほうは mb_regex_encoding ('UTF-8'); $str3 = mb_ereg_replace("第.回", "第3回", "今日は第*回目です。"); でした。
- yexob328
- ベストアンサー率25% (1/4)
検索対象の文字*がマルチバイトなので、任意の一文字には一致ないのではないでしょうか。 以下のどちらかに変更すると置換されると思います。 (1)任意の1文字以上に一致させる preg_replace("/第.+回/", "第3回", "今日は第*回目です。"); (2)マルチバイト対応の処理にする mb_regex_encoding ('SJIS'); mb_ereg_replace("第.回", "第3回", "今日は第*回目です。");
お礼
すみません、mb_ereg_replace() ならできるのは知っているのですが今回preg_replace() での疑問ということで… 説明不足申し訳ありませんでした。
お礼
ありがとうございます。 「u フラグ」 というのが専門書に載っていないのですが、具体例を書いていただけませんでしょうか? よろしくお願いいたします。
補足
<この回答へのお礼 の続き> わかりました。「u」は / / の後に書くのですね。 $str = preg_replace("/第.回/u", "第3回", "今日は第*回目です。"); 解決しました。 ありがとうございました。