simplepie.incの問題

2007/10/25 | XML

普段よく使用しているRSSをパースするためのライブラリsimplepieに問題があることがわかった。「問題」といってもsimplepie自体に問題があるのではなく、simplepieを利用する環境(PHP)側によって問題が発生することがあるようだ。

今回某サーバでsimplepieを使ってRSSのパースを試みた。他のサーバで動作していたものを持ってきて、必要部分だけ書き換えて出来上がり、と思ったらエラーがいっぱい吐き出された。エラーは2種類。

Warning: Compilation failed: unrecognized character after (? at offset 63 in /var/www/…/simplepie.inc on line 9488

Warning: Compilation failed: characters with values > 255 are not yet supported in classes at offset 31 in /var/www/…/simplepie.inc on line 9607

該当する箇所をみてみると、前者はpreg_replace関数で、後者はpreg_match関数でエラーが出ている。ウェブで検索すると、simplepieの作者のコメントが出ていた。「PCREのバグかもしれない」とのこと。どういう状態のときにこのエラーが発生するのか、ということには言及されていないけれど、まぁ、そういうことなんだ、と納得した。

で、対応。
前者のエラーは以下のような関数の中にある。
function uncomment_rfc822($data)
{
 if ((version_compare(PHP_VERSION, ‘4.4.6’, ‘<=’) && version_compare(PHP_VERSION, ‘5’, ‘>’)) || version_compare(PHP_VERSION, ‘5.2.2’, ‘<=’))
 {
  return $data;
 }
 else
 {
  return preg_replace(‘/((?:(?:¥¥¥¥”|[^(“])*(?:”(?:[^”¥¥¥¥¥r]|¥¥¥¥.)*”¥s*)?)*)((?>!¥¥¥¥)¥((?:(?2)|.)*?(?>!¥¥¥¥)¥))/’, ‘$1′, $data);
 }
}

とりあえず「チェックしない」と決め打ちしてif節の前に「return $data;」をおいて解決。

後者はこんな関数。
function is_isegment_nz_nc($string)
{
 return (bool) preg_match(‘/^([A-Za-z0-9¥-._~¥x{A0}-¥x{D7FF}¥x{F900}-¥x{FDCF}¥x{FDF0}-¥x{FFEF}¥x{10000}-¥x{1FFFD}¥x{20000}-¥x{2FFFD}¥x{30000}-¥x{3FFFD}¥x{40000}-¥x{4FFFD}¥x{50000}-¥x{5FFFD}¥x{60000}-¥x{6FFFD}¥x{70000}-¥x{7FFFD}¥x{80000}-¥x{8FFFD}¥x{90000}-¥x{9FFFD}¥x{A0000}-¥x{AFFFD}¥x{B0000}-¥x{BFFFD}¥x{C0000}-¥x{CFFFD}¥x{D0000}-¥x{DFFFD}¥x{E1000}-¥x{EFFFD}!$&¥'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u’, $string);
}

こちらもチェックをやめて「return true;」に書き換え。これで解決。
いや、まぁ、本当に「解決した」とは言えないのだが、とりあえずこれでよしとする。
おそらくバージョンによる問題だと思うので、比較的新しいものを使っている場合はこんなことしなくても、元々エラーなんて出ないと思う。たぶん、ごく一部の環境だけだ。

しかしそんな環境を使っている自分がうらめしい・・・。

コメントを残す


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net