我有一个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_string和How 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文件。
感谢。
答案 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);
}
答案 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);