【问题标题】:PHP Simple HTML DOM Parser: Select only DIVs with multiple classesPHP Simple HTML DOM Parser:仅选择具有多个类的 DIV
【发布时间】:2013-01-10 18:12:53
【问题描述】:

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

假设我有 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。使用 Simple 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>

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

div[class*=class1 class2]

问题

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

div[class=class1 class3]

适用于该示例吗?

【问题讨论】:

  • 您特别想要同时具有 .class1 和 .class2 的元素,或者任何具有 2 个或更多类的元素?
  • 仅包含 .class1 和 .class2 的元素
  • 已编辑:问题仅部分解决

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


【解决方案1】:

编辑2: 由于这是 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]")

【讨论】:

  • 感谢您的回答,但我试过了,它不适用于任何示例,.class1.class2 或 div.class1.class2。它什么也没找到。
  • 这很有趣。我自己尝试了代码,并得到了与您相同的结果。进一步研究它。
  • 我想我找到了,但在我看来,find(".class1.class2") 不起作用这一事实可能表明 html 解析器中存在错误。对我有用的解决方案是$html-&gt;find("div[class=class1 class2]")
  • 嘿,请看上面的编辑,似乎还有一个问题。
  • 更新的答案,在某个地方可能会更好,但我找不到。
【解决方案2】:

你也可以试试这个:

test.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);

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 这对我有用 - 寻找已定义父母的孩子。即 $html->find('section.whatever div.classname1,section.whatever div.classname2')
    【解决方案4】:

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

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

    但我想不会。如果你愿意,你可以切换到this library

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多