从html中提取多个

时间:2017-02-06 16:48:08

标签: php html regex xml dom

我尝试提取下面<li> </li>标记内的字词。我的正则表达式运行良好,但只给了我第一个<li>Lorem ipsum...

我对正则表达式来说相当新,我知道通过遍历DOM来实现这一点可能更可靠,但在这种情况下,首选正则表达式。任何想法我需要改变以获得所有结果,而不仅仅是那个?

/<div class="foo-bar">[\s\S]+<ul>[\s\S]*?(<li>([\s\S]*?)<\/li>)+[\s\S]*?<\/ul>/

<div class="foo-bar">
    <!-- Other junk -->
    <ul>
        <li>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit.
        </li>
        <li>
            Vestibulum iaculis nibh ac orci imperdiet ultrices.
        </li>
        <li>
            Fusce neque lacus, feugiat eget sapien eget, ullamcorper rutrum mauris.
        </li>
        <li>
            Maecenas in ipsum consectetur, finibus ex et, condimentum turpis.
        </li>
    </ul>
    <!-- Other junk -->
</div>

3 个答案:

答案 0 :(得分:1)

使用DOM + Xpath而不是RegEx。

$document = new DOMDocument();
$document->loadHTML($html);
$xpath = new DOMXpath($document);

foreach($xpath->evaluate('//div[@class="foo-bar"]/ul/li') as $li) {
  var_dump($li->textContent);
}

输出:

string(80) "
            Lorem ipsum dolor sit amet, consectetur adipiscing elit.
        "
string(75) "
            Vestibulum iaculis nibh ac orci imperdiet ultrices.
        "
string(95) "
            Fusce neque lacus, feugiat eget sapien eget, ullamcorper rutrum mauris.
        "
string(89) "
            Maecenas in ipsum consectetur, finibus ex et, condimentum turpis.
        "

答案 1 :(得分:0)

在末尾添加全局g标志。例如:

/<div class="foo-bar">[\s\S]+<ul>[\s\S]*?(<li>([\s\S]*?)<\/li>)+[\s\S]*?<\/ul>/g

您可能还希望i标志不区分大小写

答案 2 :(得分:0)

最好将以下内容与preg_match_all()一起使用。我刚测试了它here并且它正在工作。

首先preg_match_all以下内容仅获取“

的内容
/<div class="foo-bar">([\s\S]*?)+<ul>([\s\S]*?)<\/ul>([\s\S]*?)<\/div>/

然后preg_match_all上一个preg_match_all的结果与以下内容仅获取<li>内容

/<li>([\s\S]*?)<\/li>/