php:SimpleXML加载文件无效的字符错误

时间:2013-01-22 16:41:24

标签: php character simplexml

我有一个php应用程序 - 有时失败(取决于我加载的数据)并给出如下错误:

parser error : PCDATA invalid Char value 11
Warning: simplexml_load_file(): ath>/datadrivenbestpractices/Data-driven Best Practices in 
Warning: simplexml_load_file(): ^ in 

我确信有一些值会导致问题。我无法控制数据。我尝试过以下解决方案:Error: "Input is not proper UTF-8, indicate encoding !" using PHP's simplexml_load_stringHow to handle invalid unicode with simplexml以及How to skip invalid characters in XML file using PHP,但他们没有帮助。

罪魁祸首是:'数据驱动 - 最佳实践'和数据驱动的最佳实践,招募和保留代表性不足的研究生2011年5月12日 - 美国东部时间下午1:30-3:00' (可能是短划线或返回字符)。

我该怎么办?我是一个Windows php测试环境,但实时环境将是一个LAMP - 不能触摸.ini文件。

感谢。

2 个答案:

答案 0 :(得分:11)

在解析之前剥离无效字符将是最简单的修复:

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

来自:PHP generated XML shows invalid Char value 27 message

答案 1 :(得分:1)

没关系,答案在:How to skip invalid characters in XML file using PHP 做得好。这是我的代码:

stream_filter_register('xmlutf8', 'ValidUTF8XMLFilter');

class ValidUTF8XMLFilter extends php_user_filter
{
    protected static $pattern = '/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u';

    function filter($in, $out, &$consumed, $closing)
    {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $bucket->data = preg_replace(self::$pattern, '', $bucket->data);
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

$doc = simplexml_load_file("php://filter/read=xmlutf8/resource=".$serveraddress.$myparam);