Вопрос по html, php, class, parsing, simple-html-dom – PHP Simple HTML DOM Parser: выбирайте только DIV с несколькими классами

9

Я искал как сумасшедший и не нашел решения. Проблема проста.

Допустим, у меня есть 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, который имеет ОБА 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, если я оставлю запятую, она ищет вложенный class2 внутри class1. Я просто ищу И ...

РЕДАКТИРОВАТЬ

Благодаря 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 Chris
отредактировано: проблема решена только частично Chris
Вам нужны элементы с именами .class1 и .class2 или любой элемент, имеющий 2 или более классов? Marc B

Ваш Ответ

4   ответа
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);
0

Я думал, что простой HTML позволяет вам сделать:

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

Но я думаю, нет. Вы можете переключиться наэта библиотека если ты этого хочешь.

0

или же

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

Это то, что сработало для меня - поиск детей определенного родителя. т.е. $ html-> find ('section.wh независимо от div.classname1, section.whwhat div.classname2') Mr Davros
19

так как это ошибка в DOM-парсере (проверено наверсия 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")

это будет искать любой тип элемента (div, img, a и т. д.), который имеет и class1, и class2. Если вы хотите указать тип элемента для соответствия, добавьте его в начало без. любить:

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]")
Ах, спасибо большое! Я провожу так много времени в поисках этого. ++ Chris
Спасибо за ваш ответ, но я попробовал его, и он не работает ни с одним из примеров, .class1.class2 или div.class1.class2. Просто ничего не находит. Chris
Я думаю, что нашел это, но мне кажется, что тот факт, чтоfind(".class1.class2") не работает, может указывать на ошибку в html-парсере. Решение, которое работало для меня, было$html->find("div[class=class1 class2]") 19greg96
Эй, пожалуйста, см. Выше, кажется, есть еще одна проблема. Chris
это очень интересно. Я попробовал код самостоятельно и получил те же результаты, что и вы. Глядя дальше в это. 19greg96

Похожие вопросы