[PHP-users 32756] Re: preg_match_all 関数での日本語利用

shin-1 @ ca2.so-net.ne.jp shin-1 @ ca2.so-net.ne.jp
2007年 10月 18日 (木) 10:14:13 JST


  おはようございます。shin-1です。

>たぶん、Byte数だと思うのですが、オフセット値を
>利用して、substrなどで、日本語文字列処理をしてしまって
>問題なないのでしょうか?

mb_substrのほうが安全だとは思いますが、何バイト切り出すか
が明確(または末尾まで全部)なら、strcutでも問題ないと思います。

>preg_match_all関数を利用しようと思っていますが、
>日本語での利用は問題ないのでしょうか?

日本語を使うならmb_eregのほうが良いです。
mb_系とその他関数の違いは、日本語文字を正規表現に書いた
とき、それを2バイトがセットになった意味のある1文字として
認識するか、単なる2バイトが羅列されたものとみるかの違いです。

mb_ereg('[あ-お]', $str);
では、「あ」以上「お」未満の2バイトの日本語文字がHITしますが、
ereg('[あ-お]', $str);
だと、「あ」の1バイト目か、「あ」の2バイト目以上で「お」
の1バイト目以下か、「お」の2バイト目、と3つの要素が[ ]で
括られているというように1バイト単位で正規表現が認識されます。

strcutでは、単純にバイト数でカットされますので最後のバイト
が日本語文字の1バイト目であってもそこで分断されるので、末尾
が中途半端なバイト列で終わる可能性があります。
(=確実に指定したバイト数の結果が返ります)

mb_strcutでは、最後のバイトで日本語文字が分断されそうになる
と文字の切れ目を判断して、それより手前の文字までを返します。
(=場合によって、指定バイト数より1〜2バイト短い結果が返る)

なので、日本語文字をcutするなら、strcutもmb_strcutを使った
方が安全ということです。



PHP-users メーリングリストの案内