繁体   English   中英

如何处理DOMDocument中的特殊HTML字符?

[英]How to handle special HTML characters in DOMDocument?

假设我使用以下代码构建HTML片段:

$dom = new DOMDocument();
$header = $dom->createElement("h2", "Lorem & Ipsum");
$dom->appendChild($header);
print($dom->saveHTML());

打印的原始HTML代码包含未转义的&符号,而不是必需的HTML & 该代码还会引发以下PHP错误:

警告:DOMDocument :: createElement():未终止的实体引用

处理此问题的最佳方法是什么?

PHP团队似乎不愿意更改此行为( source ),因此我们必须找到一种解决方法。

一种方法是简单地自己在PHP代码中进行编码,如下所示:

$header = $dom->createElement("h2", "Lorem & Ipsum");

但是,这并不总是很方便,因为打印的文本可能在变量内,或包含&以外的其他特殊字符。 因此,您可以使用htmlentities函数。

$text = "Lorem & Ipsum";
$header = $dom->createElement("h2", htmlentities($text));

如果这仍然不是理想的解决方案,则另一个解决方法是使用textContent属性而不是createElement中的第二个参数。

在下面的代码中,我已经在DOMDocument子类中实现了此功能,因此您只需要使用BetterDOM子类即可解决此奇怪的错误。

class BetterDOM extends DOMDocument {
    public function createElement($tag, $text = null) {
        $base = parent::createElement($tag);
        $base->textContent = $text;
        return $base;
    }
}

// Correctly prints "<h2>Lorem &amp; Ipsum</h2>" with no errors
$dom = new BetterDOM();
$header = $dom->createElement("h2", "Lorem & Ipsum");
$dom->appendChild($header);
print($dom->saveHTML());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM