我尝试提取下面<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>
答案 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>/