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