2011-10-22 51 views
2

我使用XPath去除凌亂的HTML標籤,如何使用XPATH保持<p><img ... /></p>?

$nodeList = $xpath->query("//*[normalize-space(.)='' and not(self::br)]"); 
    foreach($nodeList as $node) 
    { 
     $node->parentNode->removeChild($node); 
    } 

將刪除這樣的可怕的輸入,

<p><em><br /></em></p> 
<p><span style="text-decoration: underline;"><em><br /></em></span></p> 

,但它也消除了img tag一樣,我想保持打擊,

<p><img title="picture summit" src="images/32913430_127001_e.jpg" alt="picture summit" width="590" height="366" /></p> 

如何保持img tag輸入爲XPATH?

+0

需要注意的是使用元素'br'將段落在沒有開始新段落的情況下引發回車是完全有效的。你想刪除空的段落?如果是這樣,你將不得不明確考慮你想要的和你不想要的元素。像保持'img',但是過濾掉其他東西。 – lkuty

+0

謝謝。是的,我只想刪除空的段落... – laukok

+0

好問題,+1。甚至在開始編寫XPath表達式之前,最好仔細考慮並指定「p」內的元素使其「非空」。 –

回答

1

使用

//p[not(descendant::*[self::img or self::br]) and normalize-space()=''] 
+0

非常感謝你,Dimitre! – laukok

+0

對不起,我實際上得到了這個錯誤,'警告:DOMXPath :: query()[domxpath.query]:無效表達式在C:\ wamp \ www \ test \ 2011 \ php \ tidy_html \ dom_tidy_html_5.php 120行上指的是// p [不是(後代::/* [self :: img或self :: br])和normalize-space()='']'... – laukok

+0

我修改了表達式,現在它適用於這個'// p [not(descendant :: * [self :: img or self :: br])and normalize-space()='']' – laukok

0

也許你可以使用XPath類似下面的1.0表達式刪除不需要的段落:

//p[count(text())=0 and count(img)=0] 
+0

謝謝你,Ikuty。 – laukok

相關問題