電子書籍の厳選無料作品が豊富!

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

A 回答 (3件)

> $str = preg_replace("/第.回/", "第3回", "今日は第*回目です。

");

preg_replace に渡すパターンに u フラグをつけておかないと
渡されたデータがUTF-8であるとは認識されません。
したがって、 '.' は一文字ではなく一バイトにマッチすることになってしまいます。

この回答への補足

<この回答へのお礼 の続き>

わかりました。「u」は / / の後に書くのですね。

$str = preg_replace("/第.回/u", "第3回", "今日は第*回目です。");

解決しました。
ありがとうございました。

補足日時:2008/02/25 13:57
    • good
    • 1
この回答へのお礼

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

お礼日時:2008/02/25 10:23

すみません。


文字コードはUTF-8とのことですのでマルチバイト対応のほうは

mb_regex_encoding ('UTF-8');
$str3 = mb_ereg_replace("第.回", "第3回", "今日は第*回目です。");

でした。
    • good
    • 0

検索対象の文字*がマルチバイトなので、任意の一文字には一致ないのではないでしょうか。


以下のどちらかに変更すると置換されると思います。

(1)任意の1文字以上に一致させる
preg_replace("/第.+回/", "第3回", "今日は第*回目です。");

(2)マルチバイト対応の処理にする
mb_regex_encoding ('SJIS');
mb_ereg_replace("第.回", "第3回", "今日は第*回目です。");
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/02/25 10:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!