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を見つけたいだけです。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]

動作しますが、問題は、この2つをこの順序で正確に検索することです。私が持っているとしましょう

<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")

指定された 2 つのクラスの間にスペースがある場合、両方のクラスを持つ要素、または最初のクラスを持つ要素にネストされた要素と一致します。

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

これを試すこともできます:

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);
于 2016-01-10T12:30:29.763 に答える