PHP:使用筛选器删除XML中无效的utf-8字符

PHP:使用筛选器删除XML中无效的utf-8字符,php,xml,utf-8,character-encoding,Php,Xml,Utf 8,Character Encoding,我有一个大文件,所以我创建了一个过滤器,用于从XML中删除无效的utf-8字符 class ValidUTF8XMLFilter extends php_user_filter { protected static $pattern = '/([\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F]

我有一个大文件,所以我创建了一个过滤器,用于从XML中删除无效的utf-8字符

class ValidUTF8XMLFilter extends php_user_filter {

    protected static $pattern = '/([\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})|./x';

    function filter($in, $out, &$consumed, $closing)
    {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $bucket->data = preg_replace(self::$pattern, '$1', $bucket->data);
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}
此筛选器还将删除utf-8字符,不仅在xml中无效,在utf-8中也无效。 正则表达式取自。这门课取自这个答案:并重写了。该答案中的模式不适用于无效的utf-8字符,例如0x1D


当无效字节从缓冲区的末尾开始,并在下一次筛选的开头结束时,此筛选器是否工作?这种情况可能吗?

不,我认为它行不通。它将剥离恰好在几个bucket之间拆分的代码单元的有效序列


它最终不应该使用可能不完整的序列(如果必要,它应该不传递任何内容并返回
PSFS\u FEED\u ME
)。

您想做什么?您是在尝试剥离格式不正确的UTF-8子序列(通常这是个坏主意,您应该用替换字符替换它们,但这是另一个主题),还是希望对有效的UTF-8序列进行操作,但删除XML中非法的字符(例如,大多数C0控制代码)?我想去除格式错误的UTF-8 USB序列,并删除XML中非法的字符。您是如何获得非UTF-8文件的UTF-8文件的?停在那里,重新考虑你的赠品。它们没有任何意义。问题是,很难找到合适的正则表达式来发现这种情况。第二件事是,你说,它将剥离有效的代码序列。有没有可能,它不会剥离非法序列的代码?@pro没有,它不可能不会剥离非法序列,因为非法序列一旦分离,就永远不会成为合法序列。原因是Unicode规范要求有效的前导字节(或ascii范围内的字节)永远不要被视为非法序列的一部分。@pro我不建议您使用正则表达式。unicode规范的表3-7将帮助您: