DomDocument和html实体

时间:2011-08-28 11:46:33

标签: php character-encoding domdocument

我正在尝试解析包含一些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。

是否有某种方法可以防止它被带走&amp;对于一个HTML实体并让它只是不管它?我试图将substituteEntities设置为false,但它没有做任何事情

5 个答案:

答案 0 :(得分: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";    ?>

答案 1 :(得分:3)

这不是问题的直接答案,但您可以使用UTF-8代替,它允许您直接保存÷或×等字形。要在其他需要a little hack上使用带有PHP DOM的UTF-8。

此外,如果您尝试显示数学公式(如A×B所示),请查看MathML

答案 2 :(得分:1)

你确定&amp;被替换为&amp;?如果是这种情况,你会看到确切的实体,如文本,而不是你得到的乱码。

我的猜测是它被转换为实际字符,并且您正在查看带有latin1字符集的页面,该字符集不包含此字符,因此会出现乱码。

如果我渲染你的例子,我的输出是:

fullname:  A × B 

href: http://example.com/

在latin1 / iso-8859-1中查看时,我看到你正在描述的输出。但是当我将字符集设置为UTF-8时,输出就可以了。

答案 3 :(得分:0)

我面临同样的问题,事实上,utf8_encode和deccode对某些情况做了诀窍而不是全部,例如&#x03A3;无法使用utf-8解码函数渲染,其基本思路是我们需要的是将html实体保留在字符串中。

答案 4 :(得分:0)

我通过使用 BOM 将 UTF-8 转换为 UTF-8,解决了实体损坏的问题。