人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPで、RSS等のXMLを取得し、パースしています。

その際、
・不正な文字
・不正な文字コード
をうまく除去できずに、エラーが沢山出ます。
preg_matchを使うので、urlencode で変な記号が入らないようにしていますが、
別のとこでエラーがでたりします。

unterminated entity reference ...

Compilation failed: nothing to repeat at offset

Entity: line 499: parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xE3 0x2E 0x2E 0x2E in

というようなのが多いです。

php5のsimplexml_load_string等で今はパースしています。
文字コードを整え、不正文字を見つければ一つ一つ追加で置換コードを書き、
preg_matchのために「+」等をいちいち置換し・・・。
エラーが筍のように次々と出て終わりが見えません。

WEBから受け取ったデータを加工して使う、というスキルが足りない気がします。


何かスマートに、XMLを取得して使う方法はないのでしょうか?

●質問者: onigirin
●カテゴリ:ウェブ制作
✍キーワード:AT nothing PHP RSS UTF-8
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● t_shiono
●28ポイント

問題を確認させてください。

処理として、

・何らかの方法でデータをWEBから取得する

・取得したXMLをsimplexml_load_stringを利用してパースする

・パースしたXMLの一部分に正規表現によるマッチングを行いたいため、preg_matchを利用する

このうちのパースでエラーが出ているということでよいでしょうか?

どのようなデータを取得しているか分からないのですが、この場合であれば、WEBからの取得の方法が問題なのだと思うのですが、どのように取得していますか?

ちなみに、私はWEBからのデータの取得は、PEARのHTTP_Requestを利用して取得することが多いです。

それとも、正規表現の処理を踏まえてパース前に何か処理をしているために、パースが失敗しているのでしょうか?もし、そうであれば、パース後に必要があれば正規表現のための置換を行ってみてはどうでしょうか?

◎質問者からの返答

どうもありがとうございます。

ちょっと混乱してました・・・。

http://b.hatena.ne.jp/keyword/web%E3%82%B5%E3%83%BC%E3%83%93%E3%...

のRSSを「simplexml_load_file」でパースし、データを取得。

ですが、 parser error : PCDATA invalid Char エラーが発生。

ホットペッパーの部分に、UTF-8エディタで見ると♂の半角のような文字が入っていてエラーになる。

そのため「simplexml_load_file」はやめ、「file_get_contents」でRSS取得。

「preg_replace」で上記不正文字を個別に指定して除去。

RSSによっては「Input is not proper UTF-8, indicate encoding」が出るため、

取得したデータはUTF-8に再変換してから除去することに。解決。


その後「simplexml_load_string」で変数に入れる。

そして「preg_match」でRSSのタグ情報を見て、変数に入れておいた同じ名前のタグかチェック。

そのときにRSS(上記とは別のキーワード)によっては

上記質問にあるようなエラーが出るので、

「urlencode」実施と「+」を空白に置換。解決。

ところが

http://b.hatena.ne.jp/keyword/%E6%A5%AD%E7%95%8C?mode=rss&so...

このRSSの場合、「unterminated entity reference work」や

「Compilation failed: nothing to repeat at offset」と出る。


ただRSSを取得してパースして、と簡単に考えていたのに、

とんでもなく難航してくる。


ここで、自分のやってることは

方向性が間違えている気がして壁にぶちあたってしまいました・・・。


2 ● tezcello
●100ポイント ベストアンサー

今まで問題になっている文字を漠然と不正文字と捉えてきましたが、よく見てみたら解決したような気がします。

hotpepper の文字は、コードが x0B つまり制御文字でした。

なので、UTF-8 に変換してもすり抜けるのは当り前です。

そこで、制御文字は全部除去してみました。

UTF-8 には漢字部分にASCIIの制御文字が来る事は無いので漢字に影響は与えません。

 // test1.xml は問題の文字が入っているファイルです。この行は正規のRSSを代入する文と置き換えて下さい
$rss = file_get_contents('test1.xml');

$search = array("\0", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06"
, "\x07", "\x08", "\x0b", "\x0c", "\x0e", "\x0f");
$rss = str_replace($search, '', $rss);

この後、UTF-8 -> UTF-8 のエンコード変換をすれば不正な文字も除去されて望むような結果になると思います。

◎質問者からの返答

どうもありがとうございます。

試してみたところ、ホットペッパーの♂はうまく除去されました!

制御文字というやつなのですね。

自分のレベルを超えていて完全にわからなかったので助かりました・・・。

前回の質問の内容は完全に解消されて助かりました。

本当にどうもありがとうございます!


そのほかのエラーについては、これが解決して落ち着いてエラーを辿ってみると、

ただのコーディングミスな気がしてきました。

関数で「&」が含まれる変数をreturnしたところでエラーが出ていただけでした。

preg_matchで使うために、

urlencodeで自動変換されない「+」を「%2B」にしたり、

変数からreturnするために「&」を「%26」に変換したり、

泥臭い方法には変わりないままです・・・。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ