使用DOM解析器php获取多个元素

时间:2014-07-03 21:16:20

标签: php html simple-html-dom

我想使用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
...

我该怎么用呢?我的方式是真的还是我必须使用另一种方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

是的,您绝对需要使用其他解决方案来获取值。首先,由于您需要另一组值(包括titletext),因此需要扩大搜索范围,即定位父元素<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