如何按类名获取DOM元素?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

我在用PHP DOM ,我正在尝试在具有给定类名的DOM节点中获取一个元素。得到子元素的最好方法是什么?

最新情况:最后我用了Mechanize,使用起来要容易得多。

提问于
用户回答回答于

更新:*[@class~='my-class']css选择器的Xpath版本

它看起来像上面的选择器被编译为以下xpath(未经测试):

[contains(concat(' ', normalize-space(@class), ' '), ' my-class ')]

所以PHP将是:

$dom = new DomDocument();
$dom->load($filePath);
$finder = new DomXPath($dom);
$classname="my-class";
$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");

基本上我们在这里所做的就是规范化class属性,这样即使是一个单独的类也被空间限制,并且完整的类列表以空格为界。然后追加我们正在寻找的空间。通过这种方式,我们正在有效地查找并找到唯一的实例my-class

使用xpath选择器?

$dom = new DomDocument();
$dom->load($filePath);
$finder = new DomXPath($dom);
$classname="my-class";
$nodes = $finder->query("//*[contains(@class, '$classname')]");

如果它只有一种类型的元素,您可以用*特定的标记名替换它。

如果你需要做很多非常复杂的选择,我会推荐Zend_Dom_Query哪些支持CSS选择器语法(a la jQuery):

$finder = new Zend_Dom_Query($html);
$classname = 'my-class';
$nodes = $finder->query("*[class~=\"$classname\"]");
用户回答回答于

如果你希望获得类的innerhtml而不使用Zend,则可以使用以下内容:

$dom = new DomDocument();
$dom->load($filePath);
$classname = 'main-article';
$finder = new DomXPath($dom);
$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
$tmp_dom = new DOMDocument(); 
foreach ($nodes as $node) 
    {
    $tmp_dom->appendChild($tmp_dom->importNode($node,true));
    }
$innerHTML.=trim($tmp_dom->saveHTML()); 
echo $innerHTML;

扫码关注云+社区