PHP简单HTML DOM解析器:仅选择具有多个类的DIV

时间:2013-01-10 18:12:53

标签: php class parsing html simple-html-dom

我疯了,发现没有解决方案。问题很简单。

假设我有3个DIV:

<div class="class1">
  <div class="subclass"> TEXT1 </div>
</div>

<div class="class2">
  <div class="subclass"> TEXT2 </div>
</div>

<div class="class1 class2">
  <div class="subclass"> TEXT3 </div>
</div>

所以,非常简单。我只是想找到TEXT3,它有BOTH class1和class2。使用简单的HTML DOM Parser,我似乎无法让它工作。

这是我试过的:

foreach($html->find("[class=class1], [class=class2]") as $item) {
$items[] =  $item->find('.subclass', 0)->plaintext;
}

问题是,

find("[class=class1], [class=class2]")

它找到所有这些,因为逗号就像一个OR,如果我留下逗号,它正在查找class1中的嵌套class2。我只是在找一个AND ...

修改

感谢19greg96,我发现了

div[class=class1 class2]

有效,问题是它按顺序查找那两个。假设我有

<div class="class1 class2">
  <div class="subclass"> TEXT3 </div>
</div>

然后它有效,如果我有

<div class="class1 class2 class3">
  <div class="subclass"> TEXT3 </div>
</div>

当我放入一个asterix时它会起作用,因为它会查找子字符串:

div[class*=class1 class2]

问题

我只知道class1和class3在那里,但也许是其他的并且是随机顺序的。那仍然行不通。知道如何寻找A&amp; B在任何随机顺序?那么

div[class=class1 class3]

适用于那个例子吗?

4 个答案:

答案 0 :(得分:19)

EDIT2: 由于这是dom解析器中的错误(在version 1.5上测试),因此没有简单的方法。 我能想到的解决方案:

$find = $html->find(".class1");
$ret = array();
foreach ($find as $element) {
    if (strpos($element->class, 'class3') !== false) {
        $ret[] = $element;
    }
}
$find = $ret;

基本上你会发现所有带有第一类的元素,而不是遍历这些元素来找到那些具有第二类的元素(在这种情况下为三)。


上一个回答:

简单回答(应根据html规范工作):

find(".class1.class2")

这将查找具有class1和class2的任何类型的元素(div,img,a等..)。如果要指定要匹配的元素类型,请将其添加到开头,而不是.,如:

find("div.class1.class2")

如果两个指定类之间有空格,它将匹配元素与第一个类中嵌套在元素中的类或元素:

find(".class1 .class2")

将匹配

<div class="class1">
  <div class="class2">this will be returned</div>
</div>

<div class="class1 class2">this will be returned</div>

编辑: 我尝试了你的代码,发现上面的解决方案不起作用。 然而,确实有效的解决方案如下:

$html->find("div[class=class1 class2]")

答案 1 :(得分:1)

你也可以试试这个:

的test.html

int powerThroughRecursion(int n) {      
    if (n == 0) {
        return 1;
    }
    if (n <= 1) {
        return n;
    }
    return n * powerThroughRecursion(n - 1);
}

解决方案:

<h1 class="first second last">
    <p>Paragraph</p>
</h1>

答案 2 :(得分:0)

$ html-&gt; find(div [class = classname1],div [class = classname2]);

$ html-&gt; find(div.classname1,div.classname2);

答案 3 :(得分:0)

我曾经以为简单的html dom可以让您这么做:

$html->find(".class1.class2")

但我想不是。如果需要,可以切换到this library