[PHP-dev 518] Re: [Fwd: Japanese: mb_split broken?]

Yasuo Ohgaki php-dev@php.gr.jp
Wed, 02 Oct 2002 08:37:34 +0900


大垣です。

Moriyoshi Koizumi wrote:
> 小泉です。
> 
> mb_split() と mb_ereg() の正規表現は拡張モードのものとして扱われるので、
> 
> $comps = mb_split( ' ', 'a b c d e' );
> 
>> 
> $comps = mb_split( "\n", "a\nb\nc\nd\ne" );
> 
> としても、正しい結果は得られません。
> ' ' '\r' '\n' '\f' '\t' がだめですね。
> 
> 代わりに、
> $comps = mb_split( '[[:space:]]', 'a b c d e' );
> とやると、期待通りの結果を得られます。
> 
> mb_ereg_replace() も同様に、デフォルトでは拡張モードですので、
> 
> <?php echo mb_ereg_replace( ' ', '-', 'a b c d e' ); ?>
> 
> とやると、妙な結果を得ます。
> 
> <?php echo mb_ereg_replace( ' ', '-', 'a b c d e', '' ); ?>
> 
> とすると大丈夫です。
> これは、ドキュメントの問題のような気がします。
> 
> しかし、分かりにくすぎるので、そもそも拡張モードの挙動を
> 変更した方がいいと思うのですが、どうでしょうか?


変更するなら今すぐした方がよいと思います。
# 基本的にはereg_*()と同じ動作に変更した方が解り易い、
# オーバーロードした時に便利と思います。

この変更で困るという方もいると思いますが、どうでしょうか?

--
Yasuo Ohgaki


> 
> 以下のような感じです。
> 
> Index: mbregex.c
> ===================================================================
> RCS file: /repository/php4/ext/mbstring/mbregex.c,v
> retrieving revision 1.9
> diff -u -r1.9 mbregex.c
> --- mbregex.c   28 Aug 2002 02:08:57 -0000      1.9
> +++ mbregex.c   1 Oct 2002 20:49:57 -0000
> @@ -2442,6 +2442,7 @@
>        }
>        goto normal_char;
> 
> +#if 0_moriyoshi
>      case ' ':
>      case '\t':
>      case '\f':
> @@ -2449,6 +2450,7 @@
>      case '\n':
>        if (options & MBRE_OPTION_EXTENDED)
>         break;
> +#endif
> 
>      default:
>      normal_char:               /* Expects the character in `c'.  */
> 
>