[PHP-dev 835]Re: FYI:mbstring+鬼車 参考実装

Moriyoshi Koizumi moriyoshi @ at.wakwak.com
2003年 8月 3日 (日) 21:43:53 JST


小泉です。

# 仕事が詰まっていたもので、前回のメールから大変間があいてしまいました。
# あと、遅くなりましたが、小迫さん、情報ありがとうございました。

廣川さんご指摘の segfault を直して、さらに、さまざまなフィックスを行なった
バージョンが出来ました。今回は php4 ブランチへのパッチも用意してあります。

PHP5 ブランチ用:
http://www.voltex.jp/patches/oniguruma-patch-v5-20030803.diff.gz

PHP4 ブランチ用:
http://www.voltex.jp/patches/oniguruma-patch-v4-20030803.diff.gz

パッチの当て方は、
http://ns1.php.gr.jp/pipermail/php-dev/2003-July/000824.html
を参照してください。

[既知の問題点]

マルチバイト文字が文字クラス内で使われている時に、
失敗します。これは鬼車の非互換性のためなのでしょうか?
現在調査中です。

今のところ分かっていることは、少なくとも旧来の mbregex で
使われていた実装は文字クラス内のマルチバイト文字を
適宜処理するということです。(これが正しいか正しくないかは別として)

$KCODE="EUC-JP"
r = /([a-z]+)/.match("mzxfp");
r and print "#{r[0]}\n"

上記の、いかにも手習いが書いたコードを、鬼車が使われていない ruby で
実行すると、

koizumi @ roadrunner:~$ ruby -v
ruby 1.6.8 (2003-07-09) [i386-linux]
koizumi @ roadrunner:~$ ruby /tmp/test.rb
/tmp/test.rb:2: invalid regular expression: /([\243\341-\243\372]+)/

となります。一方、鬼車を使ったものだと、

koizumi @ roadrunner:~/src/ruby$ ./ruby -v
ruby 1.8.0 (2003-07-29) [i686-linux]
koizumi @ roadrunner:~/src/ruby$ ./ruby /tmp/test.rb
/tmp/test.rb:2: empty range in char class: /([\243\341-\243\372]+)/

となります。

同等であるはずの、php のコードでは、

<?php
mb_regex_set_options('');
mb_regex_encoding('EUC-JP');
if (mb_ereg('[a-z]', "あ", $regs)) {
    print "{$regs[0]}\n";
}
if (mb_ereg('[a-z]', "い", $regs)) {
    print "{$regs[0]}\n";
}
if (mb_ereg('[a-z]', "う", $regs)) {
    print "{$regs[0]}\n";
}
if (mb_ereg('[a-z]', "mzxfp", $regs)) {
    print "{$regs[0]}\n";
}
?>

koizumi @ roadrunner:~$ php /tmp/test.php
m

となります。何か見落としている可能性大ですので、
どなたか情報お持ちでしたら、お知らせください。

それでは。



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