如何在php中使用dom删除一个类?

时间:2015-03-18 08:46:03

标签: php dom

我想删除包含引用的类“refs”。从我获取内容的页面(http://www.sacred-destinations.com/mexico/palenque)看起来像:

 <div class="col-sm-6 col-md-7" id="essay">
    <section class="refs">
    </section>
    </div><!-- end #essay -->

现在我没有得到如何删除这个'refs'类,因为它被包含在“section”中,就像某些东西一样。 这是我到目前为止所做的事情......

<?php
$url="http://www.sacred-destinations.com/mexico/palenque";
 $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
    $html = curl_exec($ch);
    curl_close($ch);
    $newDom = new domDocument;
    libxml_use_internal_errors(true);
    $newDom->loadHTML($html);
    libxml_use_internal_errors(false);
    $newDom->preserveWhiteSpace = false;
    $newDom->validateOnParse = true;
    $sections = $newDom->saveHTML($newDom->getElementById('essay'));
$text=$sections->find('<section class="refs">');
$result=removeClass($text);
echo $result;
?>

1 个答案:

答案 0 :(得分:0)

DOMDocument没有find()方法,你必须使用带有XPath表达式的DOMXPath :: evaluate()。

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_use_internal_errors(false);
$dom->preserveWhiteSpace = false;
$xpath = new DOMXPath($dom);

$expression = 
  '//div[
     @id="essay"
   ]
   /section[
     contains(
       concat(" ", normalize-space(@class), " "), " refs "
     )
   ]';

foreach ($xpath->evaluate($expression) as $section) {  
  $section->removeAttribute('class');
}
echo $dom->saveHtml();

类属性可以包含多个值,例如classOne classTwo。使用normalize-space()时,空格将缩减为字符串内的单个空格(开始和结束删除)。 concat()在开头和结尾添加空格。这样可以避免将类名作为另一个类名的一部分进行匹配。

在示例中,将删除整个类属性。要修改它,您可以使用DOMElement :: getAttribute()读取它并使用字符串函数来更改它。

以下是几个基于DOM的库,可以使HTML操作更容易。