原因はpreg_matchか?

rNotePHP5対応。先日のトライでは、Google マップの航跡ログを含んでいるエントリの一部が失敗しているような傾向を感じたので、のスクリプト展開部分を調べてみる事にしよう。

と思ってたのだが、今日いろいろと手を変え品を変え試してみたところ、

function get_XMLTag($tag,&$str){
  if(**preg_match**("/<$tag.*?>[[:space:]]*(.*)[[:space:]]*<\/$tag>/s",$str,$buf)) {
        return $buf[1];
    }
    return '';
}

で、preg_matchに渡す$strのエントリが大きくなるとDateTitle要素の切り出しに失敗している事が判明。

Google マップの航跡ログが入ると必然的にエントリ全体が大きくなる傾向はあるものの、航跡ログそのものやのスクリプトには関係無く、48KBあたりの大きさを境にうまくいかなくなる模様。

再び試行錯誤してみたところ、

function get_XMLTag($tag,&$str){
/*  if(preg_match("/<$tag.*?>**[[:space:]]*(.*)[[:space:]]***<\/$tag>/s",$str,$buf)) { */
    if(preg_match("/<$tag.*?>\s*(.*)\s*<\/$tag>/s",$str,$buf)) {
        return $buf[1];
    }
    return '';
}

と"[[:space:]]“を”\s"に置き換える事で回避できた。

…かと思ったのだが、結局は110KBあたりを越えるとやっぱりダメだった。まぁ、そんなに大きなログを持った記事は2エントリしか無いので個別にログを間引けば済むのだが、微妙に残念。

いずれにしろ、32bits環境のPHP4で問題無かった処理が64bits環境のPHP5でダメだというのは釈然としないこと甚だしい。nx9030ではソースからbuildしてた事もあって、バッファサイズなどの設定が微妙に違ってるのかなぁ…

【6/22追記】PCREの設定で全面解決。

参照

rNote http://rinn.e-site.jp/rnote/

PHP: Hypertext Preprocessor http://www.php.net/