質問: 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を取得して使う方法はないのでしょうか?
回答: 今まで問題になっている文字を漠然と不正文字と捉えてきましたが、よく見てみたら解決したような気がします。 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 のエンコード変換をすれば不正な文字も除去されて望むような結果になると思います。