使用PHP DOM按id删除段落


Remove paragraph by id with PHP DOM

我正试图找到id为";测试";并将它们从html字符串中删除,我尝试过使用php-DOMDocument,但我搜索的html格式不正确,我得到了错误

$caption = "blah blah<p id ='test'>Test message</p>";
$doc = new DOMDocument();
$doc->loadHTMLFile($caption);
$xmessage = $doc->getElementById('test');

返回

警告:DOMDocument::loadHTML()[DOMDocument.loadHTML]:意外的结束标记:br i

有没有办法抑制警告?感谢

您可以使用以下代码删除带有id='test':的段落

$caption = "blah blah<p id='test'>Test message</p><p id='foo'>Foo Bar</p>";
$doc = new DOMDocument();
$doc->loadHTML($caption);
$xpath = new DOMXPath($doc);
$nlist = $xpath->query("//p[@id='test']");
$node = $nlist->item(0);
echo "Para: [" . $node->nodeValue . "]'n";
$node->parentNode->removeChild($node);
echo "Remaining: [" . $doc->saveHTML() . "]'n";

输出:

Para: [Test message]
Remaining: [<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<p>blah blah</p>
<p id="foo">Foo Bar</p>
</body></html>
]

不要使用loadHTMLFile(),要使用loadHTML()

后者需要HTML字符串,这就是您所提供的。这样做应该可以纠正警告。

getElementById需要对HTML进行验证才能工作。有关更多信息,请参阅此StackOverflow答案。

$caption = "blah blah<p id ='test'>Test message</p>";
$doc = new DOMDocument;
$doc->validateOnParse = true;  // validate HTML
$doc->loadHTML($caption);  // This loads an HTML string
$xmessage = $doc->getElementById('test');

(注意:您需要使用loadHTML,而不是loadHTMLFile)。

这可能仍然不起作用,因为HTML可能无效。

如果这不起作用,我建议使用DOMXPath。

$caption = "blah blah<p id ='test'>Test message</p>";
$doc = new DOMDocument;
$doc->loadHTMLFile($caption);
$xpath = new DOMXPath($doc);
$xmessage = $xpath->query("//p[@id='test']")->item(0);

是否有多个段落具有相同的ID?当然不是。。。

这通常是不好的做法(因为警告是有原因的),但你可以使用@来抑制警告,尽管我不能100%确定它是否适用于来自这样一个类的函数调用,如果适用,请告诉我!

$caption = "blah blah<p id ='test'>Test message</p>";
$doc = new DOMDocument();
@$doc->loadHTMLFile($caption);
$xmessage = @$doc->getElementById('test');