PHP: удаление недопустимых символов utf-8 в XML с помощью фильтра - PullRequest
1 голос
/ 19 ноября 2010

У меня большой файл, поэтому я создал фильтр для удаления недопустимых символов 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.

Будет ли этот фильтр работать в ситуации, когда недопустимые байты начинаются в конце буфера и заканчиваются в начале следующей фильтрации? Возможна ли такая ситуация?

1 Ответ

2 голосов
/ 19 ноября 2010

Нет, я не думаю, что это сработает. Он удалит допустимые последовательности блоков кода, которые оказались разделены между несколькими сегментами.

Он не должен потреблять потенциально неполные последовательности в конце (и, при необходимости, он не должен ничего пропускать и возвращать PSFS_FEED_ME).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...