【发布时间】:2019-12-02 05:48:20
【问题描述】:
我正在使用 PHP DOM API 创建一些标记。它工作正常,但在某些情况下,<br> 标记后会出现换行符\n。我设法创建了一个reprex:
$document = new DOMDocument();
$document->loadHTML('<div>text<br></div>');
$element = $document->getElementsByTagName('div')->item(0);
echo $document->saveHTML($element); // newline appears after <br>
由于某种原因,saveHTML() 不会返回最初加载的相同标记。正如我在 repl 中演示的那样,在 <br> 标签周围添加文本或使用 saveXML() 可以正常工作。
这是DOM spec 中定义的一些特殊行为吗?只有当<br> 标签是第一个或最后一个孩子时,问题才会出现,即中间没有文字。
【问题讨论】:
-
loadHTML和saveHTML不遵循 DOM 规范,因为它们将允许大多数人称之为 HTML 的损坏的 XML。您的示例有一个未关闭的<br>标签,但仍会读取它。它还会为您做很多其他事情,这可能不是您真正想要的,但它适用于一些非常糟糕的 HTML。 -
@NigelRen 根据HTML spec,
<br>是一个空元素,将/放在其>之前没有效果,因此是可选的吗?但是,没有人说 PHP 遵循该规范。 @MarkusZeller 我尝试将formatOutput设置为false。同样的事情也会发生。不过,我认为false是默认值。 -
@NigelRen 也是,即使我有
<br/>而不是<br>,saveHTML()仍然添加\n并将标签输出为<br>。 -
问题在于 DOMDocument 是一个 XML 库而不是 HTML 库。关于它认为应该如何修复和输出 HTML,它有自己的规则。换行符对 HTML 没有影响,因此它可能不会将其视为问题。
标签: php html dom domdocument