【问题标题】:How to prevent DOMXPath from expanding HTML entities?如何防止 DOMXPath 扩展 HTML 实体?
【发布时间】:2011-05-15 09:47:57
【问题描述】:

我在 PHP 中使用 DOMDocument 和 DOMXPath 来查找 HTML 文档中的元素。 该文档包含 HTML 实体,例如 &nbsp ;我希望这些实体保留在 XPath 输出中。

$doc = new DOMDocument();
$doc->loadHTML('<html><head></head><body>&nbsp;Test</body></html>');

$xpath = new DOMXPath($doc);
$nodes = $xpath->query('//body');

foreach($nodes as $node) {
    echo $node->textContent;
}

此代码产生以下输出 (UTF-8):

[space]Test

但我想要这个:

&nbsp;Test

也许它与 PHP 内部使用的 LibXML 有关,但我找不到任何保留 HTML 实体的函数。

你有什么想法吗?

【问题讨论】:

  • [space] 不是 UTF-8。你确定是 U+0020 而不是 U+00A0?
  • @Alohci:是的,你是对的,它是 U+00A0。我只是想澄清一下,输出显示的是空格而不是 nbsp 实体。
  • @Dimitre:抱歉,这是一个特定于 XPath 的问题。这是关于 XPath 查询的输出。
  • 我不知道,但是使用 SimpleXML 你可以做到 $xml = html_entity_decode($xml, ENT_NOQUOTES, 'UTF-8'); (php.net/manual/en/simplexmlelement.asxml.php#107137)

标签: php xml dom xpath html-entities


【解决方案1】:

XPath 总是会看到已扩展实体引用的 XML 文档的表示。防止这种情况的唯一方法是预处理 XML 文档,将实体引用替换为不会扩展的内容,例如将 &amp;nbsp; 更改为 §nbsp;

【讨论】:

    【解决方案2】:

    XPath 处理器不知道是否将非制动空格字符指定为 &amp;nbsp;&amp;#xA0;' -- the character is always provided to it as a character entity -- `。

    【讨论】:

    • 我认为这个答案不正确。 XPath 处理器不在 Infoset 上运行,它在根据 Infoset 定义的 XPath 数据模型 (XDM) 上运行。 Infoset 允许存在未扩展的实体参考信息项。 XDM 没有。所以这确实是一个 XPath 问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 2017-05-08
    • 2012-07-09
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多