получить более одного элемента с помощью парсера DOM php

Я хочу использовать парсер php и Simple HTML DOM для анализа страницы.

HTML-разметка следующая:

<div class="question">
    <b>My-title1</b><br />
    <label class="false"><input type="radio" name="q1" value="0" />1. <span >text-1</span></label><br />
    <label class="true"><input type="radio" name="q1" value="1" />2. <span >text-2</span></label><br />
    <label class="false"><input type="radio" name="q1" value="0" />3. <span >text-3</span></label><br />
    <label class="false"><input type="radio" name="q1" value="0" />4. <span >text-4</span></label><br />
</div>

Теперь я использую этот код для получения значения My-title:

foreach($html->find('b') as $e) 
{
    echo $e->innertext . '<br>';
}

Но я хочу большего...

Я хочу получить от text-1 до text-4, а также найти и отфильтровать, у кого из них есть class=true

Итак, мой окончательный результат должен быть:

my-title1
text-1
*text-2
text-3
text-4
my-title2
text-1
text-2
text-3
*text-4
...

Как я могу это использовать? Это мой путь, или я должен использовать другое решение для этого?


person HamidReza    schedule 03.07.2014    source источник
comment
я не вижу ничего с элементом класса в этом примере.   -  person lagbox    schedule 04.07.2014
comment
я отредактировал это, это было моей ошибкой, мой код верен, я хочу просто решение для окончательного вывода, tanx   -  person HamidReza    schedule 04.07.2014


Ответы (1)


Да, вам абсолютно необходимо использовать другое решение для получения значений. Во-первых, поскольку вам нужен другой набор значений, который будет охватывать title и text, вам необходимо расширить поиск, который будет нацелен на родительский элемент <div class="question">.

Это должно быть вашей отправной точкой. Оттуда, очевидно, вам нужно зациклить, а затем обработать детей. Рассмотрим этот пример:

include 'simple_html_dom.php';
// sample markup
$markup = '
<div class="question">
    <b>My-title1</b><br />
    <label class="false"><input type="radio" name="q1" value="0" />1. <span>text-1</span></label><br />
    <label class="true"><input type="radio" name="q1" value="1" />2. <span>text-2</span></label><br />
    <label class="false"><input type="radio" name="q1" value="0" />3. <span>text-3</span></label><br />
    <label class="false"><input type="radio" name="q1" value="0" />4. <span>text-4</span></label><br />
</div>
<div class="question">
    <b>My-title2</b><br />
    <label class="false"><input type="radio" name="q1" value="0" />1. <span>text-1</span></label><br />
    <label class="false"><input type="radio" name="q1" value="1" />2. <span>text-2</span></label><br />
    <label class="false"><input type="radio" name="q1" value="0" />3. <span>text-3</span></label><br />
    <label class="true"><input type="radio" name="q1" value="0" />4. <span>text-4</span></label><br />
</div>
';

$html = str_get_html($markup);
// get each `question class` parent
foreach($html->find('div[class="question"]') as $question_tag) {
    // get the title
    $title = $question_tag->children(0)->innertext; // title tag child
    echo $title . '<br/>';
    // texts inside span
    foreach($question_tag->find('label input span') as $span) {
        if($span->parent()->class == 'true') {
            echo '*';
        }
        echo $span->innertext . '<br/>';
    }
}

Должно получиться что-то вроде этого:

My-title1
text-1
*text-2
text-3
text-4
My-title2
text-1
text-2
text-3
*text-4
person user1978142    schedule 04.07.2014