2012-01-10 114 views
1

我试图找到段落与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我

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

回答

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"; 

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> 
] 
3

请勿使用loadHTMLFile()使用loadHTML()

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

+0

谢谢我试过,但仍然错误 – HiSpec 2012-01-10 16:27:31

+1

@ user928667:什么错误? – 2012-01-10 16:27:47

+0

@火箭感谢您的额外链接。 – 2012-01-10 16:31:45

-1

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

这通常是不好的做法(因为警告是有原因的),但是你可以使用@来压制警告,尽管我不是100%确定它可以在像这样的类的函数调用中工作,让我知道如果它!

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

使用'@'在这里工作正常,但问题是他使用了错误的方法。 'loadHTMLFile'需要一个文件名,他希望'loadHTML'需要一串HTML。 – 2012-01-10 16:18:25

+0

谢谢,但得到“可捕获的致命错误:类DOMElement的对象无法转换为字符串在” – HiSpec 2012-01-10 16:28:48

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);