RSS フィード (XML) のエラー「PCDATA invalid Char value XX」対処方法 (PHP編)

直感的な操作が売りの CMS である「concrete5」の古いバージョンで RSS フィードがうまく表示されないという問題がありました。

原因は UTF8 だけど、XML では使えない文字列が存在していたので、RSS Feed リーダーでエラーが出ていたのでした。

テキストも UTF8 にきちんとエンコーディングして、文字列も
<?xml version="1.0" encoding="UTF-8"?>
と指定しているのに

Chrome で
PCDATA invalid Char value XX. Below is a rendering of the page up to the first error.

というエラーが表示され、正常に XML が表示されなくなっていました。

これは、XML ではサポートしていない文字列があるからです。

なので、それらの 文字列を取り除く簡単な PHP 処理がこれです。

 

PHP5.4 以前の場合

function utf8_for_xml($string)
{
    return preg_replace ('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $string);
}

参考 & コード引用
http://stackoverflow.com/questions/12229572/php-generated-xml-shows-invalid-char-value-27-message

 

PHP 5.4 から

PHP5.4 より htmlspecialchars() で XML 処理ができるようになりました。

htmlspecialchars($string, ENT_XML1, "UTF-8")

参考
http://php.net/manual/ja/function.htmlspecialchars.php

以上