Лучший способ удалить все, кроме 5 предопределенных HTML-объектов с PHP - для вывода XHTML5 - PullRequest
3 голосов
/ 18 июня 2011

Я сейчас экспериментирую с доставкой XHTML5.В настоящее время я поставляю XHTML 1.1 Strict на странице, над которой я работаю.Это я для способных браузеров.Для тех, кто не принимает данные в кодировке XML, я вернусь к строгому HTML4.1.

При экспериментировании с использованием HTML5 для любого из них, при доставке в формате HTML5 все работает более или менее, как ожидалось.Первая проблема, с которой я сталкиваюсь при доставке в формате XHTML5, связана с сущностями HTML.FF4 sais ü является неопределенной сущностью.Поскольку нет HTML5 DTD.

Я прочитал, что HTML5 wiki в настоящее время рекомендует:

Не использовать ссылки на сущности в XHTML (за исключением 5 предопределенныхсущности: &, <, >, " и ')

Мне нужно <, > в определенных местах.Поэтому мой вопрос в том, как лучше всего в PHP декодировать все, кроме пяти названных выше объектов.html_entity_decode() декодирует их все, так есть ли разумный способ исключить некоторые из них?

ОБНОВЛЕНИЕ:

Я пошел с простым подходом замены / замены длямомент, так что если нет действительно элегантного способа, вопрос решен достаточно для моих неотложных нужд.

function non_html5_entity_decode($string)
{
    $string = str_replace("&",'@@@AMP',
                        str_replace("'",'@@@APOS',
                        str_replace("<",'@@@LT',
                        str_replace(">",'@@@GT',
                        str_replace(""",'@@@QUOT',$string)))));
    $string = html_entity_decode($string);
    $string = str_replace('@@@AMP',"&",
                        str_replace('@@@APOS',"'",
                        str_replace('@@@LT',"<",
                        str_replace('@@@GT',">",
                        str_replace('@@@QUOT',""",$string)))));
    return $string;
}

Ответы [ 2 ]

3 голосов
/ 10 августа 2013

ОБРАТИТЕ ВНИМАНИЕ на универсальных преобразованиях: использование html_entity_decode с параметрами по умолчанию не удаляет все именованные объекты , только те немногие, которые определены старым стандартом HTML 4.01. Таким образом, объекты типа © (& copy;) будут преобразованы; но некоторые, как + (& plus;), нет. Чтобы преобразовать ВСЕ именованные объекты, используйте ENT_HTML5 во втором параметре (!).

Кроме того, если целевым кодированием не является UTF8, невозможно получить старшие (до 255) имена, например 𝒜 (& Ascr;), если 119964> 255.

Таким образом, чтобы преобразовать «ВСЕ ВОЗМОЖНЫЕ ИМЕННЫЕ ЛИЦА», вы ДОЛЖНЫ использовать html_entity_decode($s,ENT_HTML5,'UTF-8'), но это допустимо только в PHP5.3 +, где был реализован флаг ENT_HTML5.

В частном случае этого вопроса необходимо использовать также флаг ENT_NOQUOTES вместо стандартного ENT_COMPAT, поэтому необходимо использовать html_entity_decode($s,ENT_HTML5|ENT_NOQUOTES,'UTF-8')


PS (отредактировано): спасибо @BoltClock, чтобы вспомнить о PHP5.3 +.

0 голосов
/ 18 июня 2011

Я думаю, html_entity_decode(), за которым следует htmlspecialchars(), - самый простой способ.

Это не будет конвертировать ', хотя - чтобы получить это, вам сначала нужно будет сделать htmlspecialchars(), а затем конвертировать ' в &apos.

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