0

我有一个小问题:<br>提交 PHP DomDocument 时不解析标签,例如标签。这是我的PHP代码:

$doc = new DOMDocument();
$doc->loadHTMLFile("Test.html");
$doc->formatOutput = true;
$node = new DOMElement('p', 'This is a test<br>This should be a new line in the same paragraph');
$doc->getElementsByTagName('body')->item(0)->appendChild($node);
$doc->saveHTMLFile("Test.html");
echo 'Editing successful.';

这是 HTML 代码(编辑前):

<!DOCTYPE html>
<html>
    <head>
        <title>Hey</title>
    </head>
    <body>
        <p>Test</p>   
    </body>
</html>

(修改后)

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hey</title>
</head>
<body>
    <p>Test</p>   
<p>This is a test&lt;br&gt;This should be a new line in the same paragraph</p>
</body>
</html>

为什么它不起作用?

4

2 回答 2

2

您正在尝试附加一个片段,该片段不能作为“正常”字符串工作(它怎么会知道您希望它编码什么而不是什么?)。

可以使用该DOMDocumentFragment::appendXML()函数,但正如名称所述,它需要XML,而不是HTML,因此<br> 需要自动关闭(因为我们在 XML 模式下工作):

<?php
$doc = new DOMDocument();
$doc->loadHTMLFile("Test.html");
$doc->formatOutput = true;
$node = new DOMElement('p');
$p =  $doc->lastChild->lastChild->appendChild($node);
$fragment = $doc->createDocumentFragment();
$fragment->appendXML('This is a test<br/>This should be a new line in the same paragraph');
$p->appendChild($fragment);
$doc->saveHTMLFile("Test.html");

另一个不涉及更改字符串的解决方案是将单独的文档加载为 HTML (so, $otherdoc->loadHTML('<html><body>'.$yourstring.'</body></html>'), 然后循环通过它导入到主文档中:

<?php
$doc = new DOMDocument();
$doc->loadHTMLFile("Test.html");
$doc->formatOutput = true;
$node = new DOMElement('p');
$p =  $doc->lastChild->lastChild->appendChild($node);
$otherdoc = new DOMDocument();
$yourstring = 'This is a test<br>This should be a new line in the same paragraph';
$otherdoc->loadHTML('<html><body>'.$yourstring.'</body></html>');
foreach($otherdoc->lastChild->lastChild->childNodes as $node){
    $importednode = $doc->importNode($node);
    $p->appendChild($importednode);
}
$doc->saveHTMLFile("Test.html");
于 2012-12-14T18:21:42.483 回答
0

你试过<br/>而不是<br>?它可能与标记的有效性有关。<br>是无效的。

于 2012-12-14T18:14:03.263 回答