simplepie.incの問題
普段よく使用している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;」に書き換え。これで解決。
いや、まぁ、本当に「解決した」とは言えないのだが、とりあえずこれでよしとする。
おそらくバージョンによる問題だと思うので、比較的新しいものを使っている場合はこんなことしなくても、元々エラーなんて出ないと思う。たぶん、ごく一部の環境だけだ。
しかしそんな環境を使っている自分がうらめしい・・・。