如何处理 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 错误:

Warning: DOMDocument::createElement(): unterminated entity reference

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

看来 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());