我正在尝试解析包含一些HTML实体的HTML,例如×
$str = '<a href="http://example.com/"> A × 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,但它没有做任何事情
答案 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 × 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;被替换为&
?如果是这种情况,你会看到确切的实体,如文本,而不是你得到的乱码。
我的猜测是它被转换为实际字符,并且您正在查看带有latin1字符集的页面,该字符集不包含此字符,因此会出现乱码。
如果我渲染你的例子,我的输出是:
fullname: A × B
href: http://example.com/
在latin1 / iso-8859-1中查看时,我看到你正在描述的输出。但是当我将字符集设置为UTF-8时,输出就可以了。
答案 3 :(得分:0)
我面临同样的问题,事实上,utf8_encode和deccode对某些情况做了诀窍而不是全部,例如Σ
无法使用utf-8解码函数渲染,其基本思路是我们需要的是将html实体保留在字符串中。
答案 4 :(得分:0)
我通过使用 BOM 将 UTF-8 转换为 UTF-8,解决了实体损坏的问题。