Современные диалекты HTML и правила хорошей практики запрещают опускать точку с запятой в объектах HTML (&likethat;). Но у меня есть задача разбирать произвольные страницы и иметь дело с плохими сущностями html без точек с запятой. И это прекрасно отображается в браузерах. Как я могу декодировать объекты HTML без точек с запятой в их соответствующие эквиваленты UTF-8 с помощью PHP?

2
Gherman 21 Апр 2014 в 13:25

2 ответа

Лучший ответ

Вы можете получить список всех html-сущностей и использовать его для замены всех без точки с запятой их представлениями UTF-8:

// get all HTML entities
$mapping = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES | ENT_HTML5, 'UTF-8');

// change array values representing the entities to regex pattern with negativ lookahead for semicolon
array_walk($mapping, function(&$value) { $value = '/'.rtrim($value, ';').'(?!;)/'; });

// replace all entities without semicolon by their utf8 representation
$html = preg_replace(array_values($mapping), array_keys($mapping), $html);
1
SBH 21 Апр 2014 в 14:30

Я предполагаю, что вы можете попробовать загрузить документ с помощью DOMDocument :: loadHTML и попробуйте сохранить его с помощью DOMDocument :: saveHTML.

Вы можете указать дополнительные параметры, используя константы libxml.

0
Charles Sarrazin 21 Апр 2014 в 09:39