2011-08-28 4 views
4

Я пытаюсь разобрать некоторые HTML, который включает в себя некоторые HTML сущности, как ×DomDocument и 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 a- B.

есть какой-то способ чтобы он не принимал & для объекта html и не оставлял его в покое? Я попытался установить substituteEntities на false, но ничего не сделал

+0

Почему вы хотите их оставить? – Gordon

+0

Я только * своего рода * хочу, что я на самом деле хочу сделать, это заменить их на x, потому что это поместило бы текст в том же формате, что и старый код из скребка, который я обновляю, и у меня абсолютно нет идея о том, как я буду включать эти символы в регулярное выражение – rafa

ответ

1

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

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

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

fullname: A × B 

href: http://example.com/ 

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

+0

Это странно, потому что я копировал этот ответ из кода. Во всяком случае, я использовал utf8_encode и deccode, и это сделало трюк. Спасибо – rafa

+0

Если вы просматриваете ответ в браузере, он автоматически пытается определить кодировку. Поэтому, если вы хотите просмотреть фактический вывод, лучше просмотреть источник страницы. –

+0

Да, я имел в виду, что просматривал источник страницы с хромом, и там, где я получил то, что я вставил – rafa

3

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

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

+0

, спасибо, buit они не уравнения – rafa

+0

Спасибо за взломать, он разрешает мои проблемы (даже если все мои объекты UTF-8 все еще подставляются HTML-тегами ...).Это 2013 год, и нам все еще нужно использовать трюк, чтобы правильно обработать UTF-8 :-( – Damien

4

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

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

Предполагая, что вы используете Latin-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"; ?> 
+0

Спасибо, просто используя utf8_encode и декодируйте вокованный, но я прочитаю обо всем остальном, что вы использовали – rafa

+0

Btw, я использовал, но в обратном порядке - поскольку мои исходные данные уже были закодированы. Хорошо работает, спасибо! –

0

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

+2

Ваш ответ должен быть комментарием. Это действительно не форум. – Oz123

Смежные вопросы