在PHP

2012-10-15 68 views
0

某一类我有一个HTML文件(串),其中包含一个div类“富”删除れ:在PHP

<html> 
<head> 
    ... 
</head> 
<body> 
<div class="whatever">Blabla</div> 
<div> 
    <span>Text</span> 
</div> 
<table> 
    <tr><td><div class="foo">GARBAGE</div></td></tr> 
</table> 
</body> 

我只是想删除所有的div类的“富“,这是我到目前为止:

$doc = new DOMDocument(); 
$doc->loadHTML($myhtml); 
$xpath = new DOMXpath($doc); 
$all = $xpath->query("/html"); 

$result = remove_elements_with_class('foo', $all); 

remove_elements_with_class函数是如何看起来像?

回答

4

后:

$xpath = new DOMXpath($doc); 

您需要:

  1. 选中所有要在这些节点上删除
  2. 呼叫DOMNode::removeChild()

这样的节点,完成第一项任务,您可以发出一个XPath查询,查找所有的<div>个节点,其类别为foo。该查询将如下所示:

//div[contains(concat(' ', @class, ' '), ' foo ')] 

注意,该处理其中元素可以有多个类,即foo bar bazbaz foo bar案件。如果这是不可取的,而您只需要对类完全匹配(所以现在只有一类恰好foo将匹配),查询变为:

//div[@class = 'foo'] 

而且,在PHP中,这将成为:

$nodes = $xpath->query("//div[contains(concat(' ', @class, ' '), ' foo ')]"); 

从这里,你把所有你想在$nodes去除,所以只是在它们之间迭代,并通过抓住<div>的父节点,并删除其子节点从文件中删除节点:

foreach($nodes as $node) { 
    $node->parentNode->removeChild($node); 
} 

这就是这一切!你可以看到它在this demo中工作。

编辑:为了保持<div>,只是删除的内容,节点的nodeValue属性设置为空字符串:

foreach($nodes as $node) { 
    $node->nodeValue = ''; 
} 

你可以看到它在this updated demo工作。您也可以用新创建的<div>替换<div>,因为该方法似乎更加简洁,但这应该适合您的使用情况。

+0

哇,很聪明! :D – Master345

+0

哇,谢谢这实际上的作品!有没有一种方法,我只能删除“垃圾”,并保持在那里的div?所以它是类“foo”的空白div。那实际上是我需要的,对不起 – Xaver

+0

@revaxarts - 当然,我已经更新了我的答案。 – nickb