PHPエラー対処方法「RSSをXML取得時に不正文字が存在する場合」


PHPでRSSをsimplexml_load_stringなどを使って解析する場合に不正な文字が含まれている時に発生するエラー対処方法のメモです。
厳格なXMLさんのご機嫌をナナメにしてしまう文字列は、RSS発信者の意外な文字列が原因になる場合がほとんどですが、どんなケースでもバシッと取得できるプログラミングをしておきたい所ですね。

SPONSORED LINK

XMLの不正文字列をエンコードで排除

文字エンコーディングの「変換⇒再変換」を使って不正な文字列を取り除いてします手法です。
これが正しい方法と言えるのかわかりませんが不正文字をほぼ排除可能なのも事実です。
正常な文字列の破壊もほとんどないので使い道はありそうですね。

$str = mb_convert_encoding($str,'SJIS','UTF-8');
$str = mb_convert_encoding($str,'UTF-8','SJIS');

XMLの不正文字列を正規表現で排除

直接制御文字を正規表現で取り除く手法です。エラーの大半を占める制御文字自体をほぼ排除できますので、以下のようなエラーの場合は解決できるかもしれません。

エラーメッセージ:Entity: line XX: parser error : CData section not finished
エラーメッセージ:Entity: line XX: parser error : PCDATA invalid Char value XX in

$str = preg_replace('/[\x00-\x1f]/','',$str);

XMLに含まれる記号を取り除く

XMLに含まれてしまった記号は思わぬバグに繋がります。その記号自体を直接取り除く手法です。基本的には前述の正規表現と同じですが、エラーの原因がはっきりしている場合には一番手っ取り早いと思います。
見落としやすい「&」が含まれるXMLのエラー対処としても役立ちます。

エラーメッセージ:Entity: line XX: parser error : EntityRef: expecting ‘;’

$str = str_replace('&','&',$str);

XMLに含まれた機種依存文字を取り除く

機種依存文字・特殊記号の含まれるEUC-JPからUTF-8への変換するのですが、SJISを間に挟んでいることがポイントです。なぜなのかと聞かれると長くなりますが、EUCから直接UTF-8に変換だと残ってしまう依存文字も取り除くことができます。

mb_convert_encoding(mb_convert_encoding($str,"sjis-win","EUC-JP"),"UTF-8","sjis-win");

まとめ

今回の紹介は力技が多くなってしまいましたが、機種依存文字などや不正文字への対応を全て記入していくよりも、より効率的な方法になっていると思います。
問題なく動いているPHPがRSS解析でXMLのエラーが突然出てしまった時に個人的に調べまくって結果が出た対処方法になっています。
「なぜそんな文字列を使うの?」と思うようなXMLでも、力技で読み込んでしまいたい時に活躍してくれると思います。

今日も知識欲は止まらない。

関連トピック

earth

PHPなどでDB不要のブログがまだまだ使えそう

データベースまで利用してわざわざ作るほどでもないブログや、 データベースが使えないサーバーだったり、 とにかく軽量化されたブログを目

Yesterday

PHPのdate関数で日付「昨日・明日・1時間前」を取得しよう!

PHPのdate関数を使えば自分の取得したい日付を1行でズバッと指定できます。 もう簡単すぎて、プログラムというよりは言葉で伝えてあげ

xampp_portable_iretemita

SDカードに「XAMPP Portable」をインストールしてPHP開発環境ゲット!

PHP開発環境として何年かぶりにXAMPPの導入を決めたんですが、XAMPPの開発環境自体をクラウドで同期できないかというトリッキーな方

xml_error

PHPエラー対処方法「simplexml_load_file」&「simplexml_load_string」

PHP simplexml_load_fileを使用して「I/O warning : failed to load external e

php_Missing_argument

PHPエラー対処方法「 Warning: Missing argument 1 for」

PHPにおけるPHP Warning: Missing argument 1 for... というエラーの原因と対処方法メモです。

Download

PHPで画像ダウンロードのボタンでリンクする方法

PHPを利用して画像をダウンロードさせるボタンを作成する方法メモです。 リンクボタンをクリックすると保存ダイアログが表示されて、ダウン

mysql_int_random

MySQL intレコードにランダム整数を一括挿入してみた

MySQLのテーブル hoge の intカラム test に10までの整数をランダムに挿入してみました。 範囲指定や上限の変更も簡単

no-copy

ガラケーで画像やデコメを再配布不可など「ファイル制限あり」にする方法

ガラケーで画像の転送不可設定をする方法についてのまとめです。 コピー制限・保存制限・画面メモ制限・キャプチャ制限などの対策と方法です。

公開日:2011/11/22