У меня большой файл, поэтому я создал фильтр для удаления недопустимых символов utf-8 из XML.
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.
Регулярное выражение взято из Многоязычная кодировка формы . Класс был взят из этого ответа: Как пропустить недопустимые символы в файле XML с использованием PHP и переписать. Шаблон в этом ответе не будет работать для недопустимых символов utf-8, например. 0x1D.
Будет ли этот фильтр работать в ситуации, когда недопустимые байты начинаются в конце буфера и заканчиваются в начале следующей фильтрации? Возможна ли такая ситуация?