9

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

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

我确信有一些值会导致问题。我无法控制数据。我尝试过以下解决方案:错误:“输入不是正确的 UTF-8,指示编码!” 使用 PHP 的 simplexml_load_stringHow to handle invalid unicode with simplexmlHow to skip invalid characters in XML file using PHP但它们没有帮助。

罪魁祸首字符串是:“数据驱动 - 最佳实践”和“数据驱动最佳实践以招募和留住代表性不足的研究生,2011 年 5 月 12 日 - 下午 1:30-3:00,美国东部标准时间”(可能是破折号或返回字符) .

我能做些什么?我的是一个 Windows php 测试环境,但实时环境将是一个 LAMP 环境——无法触及 .ini 文件。

谢谢。

4

2 回答 2

16

在解析之前去除无效字符将是最简单的解决方法:

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 生成的 XML 显示无效的 Char 值 27 消息

于 2013-01-22T17:04:26.923 回答
0

没关系,答案:如何使用 PHP 跳过 XML 文件中的无效字符 确实有效。这是我的代码:

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);
于 2013-01-22T18:11:53.683 回答