我正在尝试找到id为“test”的段落并将其从html字符串中删除,我尝试使用php Dom Document但我正在搜索的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
有没有办法抑制警告? 感谢
答案 0 :(得分:4)
您可以使用以下代码删除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>
]
答案 1 :(得分:3)
请勿使用loadHTMLFile()
使用loadHTML()
。
后者需要HTML字符串,这是您提供的。这样做应该纠正警告。
答案 2 :(得分:1)
getElementById
要求HTML在validated开始工作之前。有关详细信息,请参阅this StackOverflow answer。
$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);
答案 3 :(得分:-1)
有多个具有相同ID的段落?当然不是......
这通常是不好的做法(因为警告是有原因的),但你可以使用@来抑制警告,虽然我不是100%肯定它适用于来自这样的类的函数调用,让我知道它是否确实!
$caption = "blah blah<p id ='test'>Test message</p>";
$doc = new DOMDocument();
@$doc->loadHTMLFile($caption);
$xmessage = @$doc->getElementById('test');