2008年2月3日日曜日

preg_replace()で文字化け

UTF-8で、preg_replace()を使ってカタカナを変換しようとしたところ文字化けが発生。

$str = 'ピーエイチピー';
$regex = '[^ピー]+';
$replace = 'ピー';
echo preg_replace("/$regex/", $replace, $str);

ピー�ピー�ピー�ピーピー

調べたところ、preg系の関数(preg_match()など)はマルチバイトに対応していないらしい いるのはUTF-8でパターン修飾子を指定した場合のみ。
[PHP-users 21761]Re: preg_replaceで文字化け

(2008/02/04 追記)
UTF-8でpreg系を使う場合は、パターン修飾子として"u"を指定すればOK。
$str = 'ピーエイチピー';
$regex = '[^ピー]+';
$replace = 'ピー';
echo preg_replace("/$regex/u", $replace, $str);

ピーピーピー
参考: PHP: パターン修飾子 - Manual
(追記終わり)


マルチバイトの文字列を正規表現で変換する場合はmb_ereg系(またはmb_eregi系)の関数を使わなければならない。
$str = 'ピーエイチピー';
$regex = '[^ピー]+';
$replace = 'ピー';
echo mb_ereg_replace($regex, $replace, $str);

ピーピーピー

0 件のコメント:

ブログ アーカイブ

tags