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

Chr*_*ris 9 html php parsing class 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>
Run Code Online (Sandbox Code Playgroud)

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

这是我试过的:

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

问题是,与

find("[class=class1], [class=class2]")
Run Code Online (Sandbox Code Playgroud)

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

编辑

感谢19greg96,我发现了这一点

div[class=class1 class2]
Run Code Online (Sandbox Code Playgroud)

工作,问题是它按顺序寻找那两个.让我说我有

<div class="class1 class2">
  <div class="subclass"> TEXT3 </div>
</div>
Run Code Online (Sandbox Code Playgroud)

然后它工作,如果我有

<div class="class1 class2 class3">
  <div class="subclass"> TEXT3 </div>
</div>
Run Code Online (Sandbox Code Playgroud)

它在我输入asterix时起作用,因为它查找子字符串:

div[class*=class1 class2]
Run Code Online (Sandbox Code Playgroud)

问题

我只知道class1和class3在那里,但也许是其他的并且是随机顺序的.那仍然行不通.知道如何以随机顺序查找A&B吗?以便

div[class=class1 class3]
Run Code Online (Sandbox Code Playgroud)

适用于那个例子?

19g*_*g96 20

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

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

基本上你找到所有带有类1的元素,而不是遍历这些元素来找到具有第二类的元素(在这种情况下是三个).


上一个答案:

简单的答案(应根据HTML规范工作):

find(".class1.class2")
Run Code Online (Sandbox Code Playgroud)

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

find("div.class1.class2")
Run Code Online (Sandbox Code Playgroud)

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

find(".class1 .class2")
Run Code Online (Sandbox Code Playgroud)

会匹配

<div class="class1">
  <div class="class2">this will be returned</div>
</div>
Run Code Online (Sandbox Code Playgroud)

要么

<div class="class1 class2">this will be returned</div>
Run Code Online (Sandbox Code Playgroud)

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

$html->find("div[class=class1 class2]")
Run Code Online (Sandbox Code Playgroud)