[PHP-dev 899]Re: mb_ereg_replaceについて

kkosako @ softbank.co.jp kkosako @ softbank.co.jp
2003年 9月 30日 (火) 11:20:41 JST


> From: Moriyoshi Koizumi [mailto:moriyoshi @ at.wakwak.com]
> > 私もバグだと思います。
> > あまり自信はないのですが、パッチを添付します。
> > ruby-dev MLにも送ってみますが、Rubyでは問題ないということで
> > 放置されるかもしれません。
> 
> パッチを試してみました。せっかく見ていただいたのに申し訳ないのですが、
> どうもうまくいっていない様子でした。別のテストケースが失敗してしまいます。
> 
> そこで、私もあれからいろいろ見てみたのですが、あくまで勘ですが、
> どうも fastmap が悪さをしているように見受けられます。

問題を拡大してしまったかな?
失敗するパターンとオプションはどのようなものでしょうか?

パッチで修正した箇所は、パターンの先頭に .*があって、
Rubyのmultilline option (Perlでは 's' option)の場合には、
対象文字列の先頭からのマッチだけを試みればよい
(.*が改行文字を含めて全ての文字列にマッチするので)、
という最適化を実行するかどうか判定する部分です。

最適化の実行を止めれば(goto begbuf_matchをしない)、
正しくなるかもしれません。

   if (bufp->options & RE_OPTIMIZE_ANCHOR) {
     if (bufp->options&RE_OPTION_SINGLELINE) {
       goto begbuf_match;
     }
     anchor = 1;

しかし無限ループの問題以前に、
RE_OPTION_SINGLELINEで判定していること自体が既に
間違いで、RE_OPTION_MULTILINEでなければおかしいので、
今まで問題が起きていなかったことが不思議です。
(Rubyについては、RE_OPTION_SINGLELINEを使用しないように
変更されているので、最適化が実行されないことを除いて問題は
起きない筈ですが)
--
小迫@出向中
 


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