正規表現関数のバージョン互換
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 としての妥当性も確認されます。
とのことだが、これを読んだだけではこの挙動は予想できない。うーむ。
コメントを残す