Я выполняю форум, разработанный для поддержки международной группы математики. Я недавно переключил его на 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!)
Я нашел функцию, которая может сделать то, что вы хотите на. 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;
}
Предполагая, что ваш ввод - utf8, вы можете удалить диапазоны Unicode, используя что-то вроде
preg_replace('~[\x{17A3}-\x{17D3}]~u', '', $input);
Другой, и лучший подход - чтобы удалить все по умолчанию и внести в белый список только те символы, которые вы хотите видеть. Свойства Unicode (\ p) для этого весьма практичны. Например, удаляет все, кроме (Unicode) букв и цифр:
preg_replace('~[^\p{L}\p{N}]~u', '', $input)