Как я лучше всего удаляю unicode символы, которые XHTML рассматривает как недопустимое использование php?

Я выполняю форум, разработанный для поддержки международной группы математики. Я недавно переключил его на unicode для лучшей поддержки международных символов. В отладке этого преобразования я обнаружил, что не все unicode символы рассматривают как допустимый XHTML (соответствующий веб-сайт, кажется, http://www.w3.org/TR/unicode-xml/). Один из шагов, которые программное обеспечение форума проходит прежде, чем представить сообщения браузеру, является шагом проверки/санитизации XHTML. Это кажется разумной идеей, что на том этапе это должно удалить любые unicode символы, которые не любит XHTML.

Таким образом, мой вопрос:

Существует ли стандарт (или лучше всего) способ сделать это в PHP?

(Форум записан в PHP, между прочим.)

Я предполагаю, что отказоустойчивым было бы простое str_replace (если это является также лучшим, я должен сделать что-либо дополнительное, чтобы удостовериться, что оно работает правильно с unicode?), но это вовлекло бы меня имеющий необходимость пройти DTD XHTML (или вышеупомянутая страница W3) тщательно для выяснения что символы перечислить в поисковой части str_replace, таким образом, если это - лучший способ, кто-то уже сделал это так, чтобы я мог украсть, допустить ошибку, скопировать, он?

(Кстати, символ, который вызвал проблему, был U+000C, 'переводом формата', который (согласно странице W3) является допустимым HTML, но недопустимым XHTML!)

7
задан Loop Space 13 April 2010 в 07:43
поделиться

2 ответа

Я нашел функцию, которая может сделать то, что вы хотите на. phpedit.net.

Я выложу функцию для архива, кредиты на ltp на PHPEdit.net:

/**
 * Removes invalid XML
 *
 * @access public
 * @param string $value
 * @return string
 */
function stripInvalidXml($value)
{
    $ret = "";
    $current;
    if (empty($value)) 
    {
        return $ret;
    }

    $length = strlen($value);
    for ($i=0; $i < $length; $i++)
    {
        $current = ord($value{$i});
        if (($current == 0x9) ||
            ($current == 0xA) ||
            ($current == 0xD) ||
            (($current >= 0x20) && ($current <= 0xD7FF)) ||
            (($current >= 0xE000) && ($current <= 0xFFFD)) ||
            (($current >= 0x10000) && ($current <= 0x10FFFF)))
        {
            $ret .= chr($current);
        }
        else
        {
            $ret .= " ";
        }
    }
    return $ret;
}
2
ответ дан 7 December 2019 в 16:40
поделиться

Предполагая, что ваш ввод - utf8, вы можете удалить диапазоны Unicode, используя что-то вроде

 preg_replace('~[\x{17A3}-\x{17D3}]~u', '', $input);

Другой, и лучший подход - чтобы удалить все по умолчанию и внести в белый список только те символы, которые вы хотите видеть. Свойства Unicode (\ p) для этого весьма практичны. Например, удаляет все, кроме (Unicode) букв и цифр:

  preg_replace('~[^\p{L}\p{N}]~u', '', $input)
1
ответ дан 7 December 2019 в 16:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: