【问题标题】:How to handle special HTML characters in DOMDocument?如何处理 DOMDocument 中的特殊 HTML 字符?
【发布时间】:2018-08-05 08:03:36
【问题描述】:

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

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

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

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

最好的处理方法是什么?

【问题讨论】:

标签: php html domdocument


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-08-22
    • 2013-08-25
    • 1970-01-01
    • 2011-09-28
    • 2011-04-23
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多