删除通过ID与段落段落编号
我试图找到段落与ID“测试”,并从HTML字符串中删除它们,我试过使用PHP DOM文档,但我搜索的HTML格式严重不良我得到的错误删除通过ID与段落段落编号
$caption = "blah blah<p id ='test'>Test message</p>";
$doc = new DOMDocument();
$doc->loadHTMLFile($caption);
$xmessage = $doc->getElementById('test');
回报警告:DOM文档:: loadHTML()[domdocument.loadhtml]:预期的结束标记:BR我
有没有办法来抑制警告? 谢谢
您可以使用下面的代码删除一个对与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";
OUTPUT:
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>
]
有多个段落具有相同的ID?当然不是...
这通常是不好的做法(因为警告是有原因的),但是你可以使用@来压制警告,尽管我不是100%确定它可以在像这样的类的函数调用中工作,让我知道如果它!
$caption = "blah blah<p id ='test'>Test message</p>";
$doc = new DOMDocument();
@$doc->loadHTMLFile($caption);
$xmessage = @$doc->getElementById('test');
使用'@'在这里工作正常,但问题是他使用了错误的方法。 'loadHTMLFile'需要一个文件名,他希望'loadHTML'需要一串HTML。 – 2012-01-10 16:18:25
谢谢,但得到“可捕获的致命错误:类DOMElement的对象无法转换为字符串在” – HiSpec 2012-01-10 16:28:48
getElementById
要求HTML是validated它会工作之前。有关更多信息,请参阅this * 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);
谢谢我试过,但仍然错误 – HiSpec 2012-01-10 16:27:31
@ user928667:什么错误? – 2012-01-10 16:27:47
@火箭感谢您的额外链接。 – 2012-01-10 16:31:45