通过正则表达式选择包含超过1对标记的HTML

时间:2015-08-21 11:13:22

标签: php regex

<div class="apple">

    <a href="..." > ... </a>

    <div class="boy">
        (some content here)
    </div>

    <div class="cat">
        <b>Text One.</b> <br> <i>Text Two.</i>
    </div>

    <div class="dog">
        <b>Text One.</b> <br> <i>Text Two.</i>
    </div>

</div>

.
. (and there are couple more structure with cat class inside but not necessarily under the class apple)
.

<div class="zoo">
.
    <div class="cat">
        <b>Text One.</b> <br> <i>Text Two.</i>
    </div>
.
</div>
.
.
.

我正在使用PHP。 我想知道如何准确选择&#34; Text One。&#34;只来自div class =&#34; cat&#34; under div class =&#34; apple&#34;超出HTML(但不是来自任何其他)。

Currnetly我正在做这样的事情:

$html=file_get_contents('xxx.html');

$a=preg_match_all("/\<div class\=\"apple\"(.*)\<div class\=\"cat\"\>(.*)<\/b\>/s",$html,$b);

foreach ($b[1] as $value) {
    echo strip_tags("$value");
}

我刚刚在网上找到它,它可能是可能但不是最适合的情况。

许多不相关的内容也被选中(我得到了最后一个标签内的所有内容,比我想要的更多内容)

请建议我适当的正则表达式或更好的解决方法。

1 个答案:

答案 0 :(得分:0)

由于您提到了更好的方法,我建议您使用simple html dom库,http://simplehtmldom.sourceforge.net

在你的例子中,你会像这样使用它:

<?php

include 'simple_html_dom.php';

$html = str_get_html('<div class="apple">

    <a href="..." > ... </a>

    <div class="boy">
        (some content here)
    </div>

    <div class="cat">
        <b>Text One.</b> <br> <i>Text Two.</i>
    </div>

    <div class="dog">
        <b>Text One.</b> <br> <i>Text Two.</i>
    </div>

</div>

.
. (and there are couple more <div class="apple"> structure with cat class inside)
.

<div class="apple">
.
.
.
</div>
.
.
.');

$text = $html->find('div.cat b',0)->innertext;

print $text . PHP_EOL;

// it will print this
// Text One.