使用php Dom删除id的段落

时间:2012-01-10 16:09:09

标签: php domdocument

我正在尝试找到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

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

4 个答案:

答案 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');