PHP5のsimple xmlでrssの読み込みを行っているのですが、たまに読み込めないRSSがあります。

どうやらXML内に不正な文字列が存在するようです。

具体例ですとたとえば今現在、はてぶの朝鮮日報のRSSがぶっ壊れています(simplexmlでロードできませんし、firefoxでも表示できません)。
http://b.hatena.ne.jp/entrylist?mode=rss&url=http%3A%2F%2Fjapanese.chosun.com%2F&sort=hot&threshold=3

以下のurlで論じられている、対処法でもうまくいきませんでした。

http://fladdict.net/blog/2006/06/rssutf8.html
http://fladdict.net/blog/2006/05/hatenatube_3.html#comments

はてぶのRSSは、こういう現象がちょくちょく起きるのですが、PHPでRSSをロードする際の汎用的かつ具体的な対処法がありましたら、ご教授お願いいたします。
解決できたら500ポイントぐらいバーンとあげちゃいます。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2006/07/08 15:30:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:tmasao No.1

回答回数77ベストアンサー獲得回数20

ポイント60pt

この現象ですが、すでに挙げられたURLのエラーが消えてしまっているようなので、おそらくその原因となったと思われる http://b.hatena.ne.jp/entrylist?mode=rss&url=http%3A%2F%2Fja... を対象として調査した結果を報告します。

これが不正なRSSとなっている原因は、 0x13 というXML内に含めてはいけないバイナリ文字が混入していることに起因しています。

ですから、対処法はすでに挙げられているものと類似の感じ:

$rss_data = file_get_contents("z.rss");

$p = '/[\x00-\x08\x0b\x0c\x0e-\x1f]/';

$result = preg_replace($p, "", $rss_data);

print $result;

と、こうすることで手元ではXMLパーサを通過できるようになりました。

いかがでしょうか?

念のため、XML仕様書の該当箇所を挙げておきます。ご参考まで。

cf. http://www.w3.org/TR/xml/#charsets

id:vas-animatum

tmasaoさん、ありがとうございます。

原因、解決法、資料すべて明快に示していただいてとても助かりました。

ちょっと今、他の私事で手を離せない状況なのですが、近日中にこのコードを試して見ます。

ほんとうにありがとうございました。

2006/07/06 01:47:22

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません