如何处理 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 & Ipsum</h2>" with no errors
$dom = new BetterDOM();
$header = $dom->createElement("h2", "Lorem & Ipsum");
$dom->appendChild($header);
print($dom->saveHTML());
假设我使用以下代码构建了一个 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 & Ipsum</h2>" with no errors
$dom = new BetterDOM();
$header = $dom->createElement("h2", "Lorem & Ipsum");
$dom->appendChild($header);
print($dom->saveHTML());