質問: なぜPHPのpreg_match関数はutf-8対応にしなければならないのでしょうか。 下記のひらがなを含むという正規表現に漢字が許可されてしまいます。 ``` if (preg_match('/[あ-ん]/, '関数') { return false; } //false ``` そこで、utf-8にすると漢字は許可されないです。 ``` if (preg_match('/[あ-ん]/u, '関数') { return false; } ``` なぜでしょうか。
回答: PCREの正規表現でUTF-8モードを使わない場合、UTF-8の文字は**1バイトごとに**認識されます。UTF-8で「あ」は`0xe3 0x81 0x82`、「ん」は`0xe3 0x82 0x93`なので、`[あ-ん]`は、「0xe3、0x81、0x82~0xe3まで、0x82、0x93のうちどれかの**バイト**」という意味になってしまいます。漢字でもこれらのバイトを使うことはよくあるので、ほぼヒットしてしまいます。 なお、`[あ-ん]`だと`ぁ`がはみ出してしまいます。とりあえずは`[ぁ-ん]`とすればある程度はカバーできますが、別な手段をとったほうがいいかもしれません。