T

正規表現関数のバージョン互換

PHP 4.3.2では

<?php
$str = 'あいうえお';
$pattern = '/[ぁ-ん]/u';
preg_match_all($pattern, $str, $matches);
print_r($matches);
?>

これが文字化けする。mb_internal_encoding、mb_regex_encoding、mb_languageは何を指定しても無駄。

一方、PHP 4.3.9では文字化けしない。

ところで、

<?php
$str = 'あいうえお';
$pattern = '/[ぁ-ん]/';
preg_match_all($pattern, $str, $matches);
print_r($matches);
?>

のようにパターン修飾子「u」の指定を外すと動作するようになる。

PHPのマニュアルによれば、

この修正子は、Perl 非互換な PCRE の機能を有効にします。パターン 文字列は、UTF-8 エンコードされた文字列として処理されます。 この修正子は、UNIX では PHP 4.1.0 以降、Win32 では PHP 4.2.3 以降で 使用可能です。 また、PHP 4.3.5 以降では、パターンの UTF-8 としての妥当性も確認されます。

とのことだが、これを読んだだけではこの挙動は予想できない。うーむ。

Posted by on 4月 7, 2008 in PHP

コメントを残す