10

我正在疯狂地寻找,但没有找到解决方案。问题很简单。

假设我有 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>

所以,很简单。我只想找到同时具有 class1 和 class2 的 TEXT3。使用简单的 HTML DOM 解析器,我似乎无法让它工作。

这是我尝试过的:

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

问题是,随着

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

它正在找到所有这些,因为逗号就像一个 OR,如果我离开逗号,它会在 class1 中寻找嵌套的 class2。我只是在寻找一个和...

编辑

感谢 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>

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

div[class*=class1 class2]

问题

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

div[class=class1 class3]

与那个例子一起工作?

4

4 回答 4

23

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

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

基本上,您会找到所有具有类 1 的元素,而不是遍历这些元素以找到具有类 2 的元素(在本例中为类 3)。


上一个答案:

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

find(".class1.class2")

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

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]")
于 2013-01-10T18:14:59.233 回答
1

你也可以试试这个:

测试.html

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

解决方案 :

include "simple_html_dom.php";

$html = file_get_html('test.html');
$h1 = $html->find('h1');
foreach ($h1 as $h1) {
    $h1Class = ($h1->class);
    if($h1Class == 'first second last'){
        $item['test'] = 'success';
    }else{
        $item['test'] = 'fail';
    }
    $ar[] = $item;
}
echo "<pre>";
print_r($ar);
于 2016-01-10T12:30:29.763 回答
0

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

或者

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

于 2013-10-02T16:30:19.210 回答
0

我原以为简单的 html dom 可以让你这样做:

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

但我想不会。如果需要,您可以切换到此库。

于 2019-01-30T23:46:49.073 回答