2011-10-22 81 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

相关问题