2012-01-10 111 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);