DomDocument и HTML-сущности - PullRequest
       22

DomDocument и HTML-сущности

4 голосов
/ 28 августа 2011

Я пытаюсь разобрать некоторый HTML, который включает в себя некоторые сущности HTML, например ×

$str = '<a href="http://example.com/"> A &#215; B</a>';

$dom = new DomDocument;
$dom -> substituteEntities = false;
$dom ->loadHTML($str);

$link = $dom ->getElementsByTagName('a') -> item(0);
$fullname = $link -> nodeValue;
$href = $link -> getAttribute('href');

echo "
fullname: $fullname \n
href: $href\n";    

, но DomDocument заменяет текст для A Ã B.

Есть ли какой-то способудержать его от использования & для html-сущности и заставить его просто оставить его в покое?Я пытался установить для параметра replacestitute.nt значение false, но это ничего не делает

Ответы [ 4 ]

4 голосов
/ 28 августа 2011

Из документов:

Расширение DOM использует кодировку UTF-8.
Используйте utf8_encode () и utf8_decode () для работы с текстами в кодировке ISO-8859-1 или Iconv длядругие кодировки.

Предполагается, что вы используете латино-1 попытку:

<?php
header('Content-type:text/html;charset=iso-8859-1');


$str = utf8_encode('<a href="http://example.com/"> A &#215; B</a>');

$dom = new DOMDocument;


$dom -> substituteEntities = false;
$dom ->loadHTML($str);

$link = $dom ->getElementsByTagName('a') -> item(0);
$fullname = utf8_decode($link -> nodeValue);
$href = $link -> getAttribute('href');

echo "
fullname: $fullname \n
href: $href\n";    ?>
3 голосов
/ 28 августа 2011

Это не прямой ответ на вопрос, но вместо этого вы можете использовать UTF-8, что позволяет вам сохранять глифы, такие как ÷ или × напрямую.Чтобы использовать UTF-8 с PHP DOM для других нужд немного взломать .

Также, если вы пытаетесь отобразить математические формулы (как предполагает A × B), взгляните на MathML .

1 голос
/ 28 августа 2011

Вы уверены, что & заменяется на &amp;? Если бы это было так, вы бы увидели точную сущность в виде текста, а не искаженный ответ, который вы получаете.

Я предполагаю, что он конвертируется в реальный символ, и вы просматриваете страницу с набором символов latin1, который не содержит этот символ, отсюда искаженный ответ.

Если я отрисовываю ваш пример, мой вывод:

fullname:  A × B 

href: http://example.com/

При просмотре этого в latin1 / iso-8859-1 я вижу вывод, который вы описываете. Но когда я установил кодировку в UTF-8, вывод был в порядке.

0 голосов
/ 22 декабря 2012

Я сталкиваюсь с той же проблемой, на самом деле utf8_encode и deccode делают свое дело в некоторых случаях, но не во всех, например, &#x03A3; не может быть отрисовано с использованием функции декодирования utf-8, основная идея которой нам нужнасохранить HTML-сущности такими, какие они есть в строке.

...