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

9

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

Позволять'скажем, у меня есть 3 DIV:


   TEXT1 



   TEXT2 



   TEXT3 

Итак, очень просто. Я просто хочу найти 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]")

Это'находит их все, так как запятая похожа на ИЛИ, если я оставлю запятую, это 'ищет вложенный class2 внутри class1. Я просто ищу И ...

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

Благодаря 19greg96 я узнал, что

div[class=class1 class2]

работает, проблема в том, что он ищет именно эти два в этом порядке. Позволять'Скажи, что у меня есть


   TEXT3 

тогда это работает, и если у меня есть


   TEXT3 

он работает, когда я ставлю звездочку, так как он ищет подстроку:

div[class*=class1 class2]

ПРОБЛЕМА

Я знаю только, что есть class1 и class3, но, возможно, другие и в случайном порядке. Это все еще нет работа. Любая идея, как просто искать A & В любом случайном порядке? Чтобы

div[class=class1 class3]

работает с этим примером?

только элементы как .class1, так и .class2 Chris
отредактировано: проблема решена только частично Chris
Вам нужны элементы с именами .class1 и .class2 или любой элемент, имеющий 2 или более классов? Marc B

Ваш Ответ

4   ответа
0

$ Html->найти (div [class = classname1], div [class = classname2]);

или же

$ Html->найти (div.classname1, div.classname2);

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

EDIT2: так как это ошибка в 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")

будет соответствовать


  this will be returned

или же

this will be returned

редактировать: я попробовал ваш код и обнаружил, что решения выше не работают. Решение, которое работает, однако, заключается в следующем:

$html->find("div[class=class1 class2]")
Обновленный ответ, может быть, лучше ответить где-нибудь, но я не могне могу найти это. 19greg96
Я думаю, что нашел это, но мне кажется, что тот факт, чтоfind(".class1.class2") Безразлично»Работа может указывать на ошибку в html-парсере. Решение, которое работало для меня, было$html->find("div[class=class1 class2]") 19greg96
Спасибо за ответ, но я попробовал, и это неt работать с любым примером, .class1.class2 или div.class1.class2. Просто ничего не находит. Chris
Ах, спасибо большое! Я провожу так много времени в поисках этого. ++ Chris
1

Вы также можете попробовать это:

test.html


    <p>Paragraph</p>

Решение :

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 "
";
print_r($ar);
0

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

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

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

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