Php 从html中提取多个
我正在尝试提取下面Php 从html中提取多个,php,html,regex,xml,dom,Php,Html,Regex,Xml,Dom,我正在尝试提取下面标记中的单词。我的正则表达式工作得很好,但只给了我第一个,Lorem ipsum… 我对regex相当陌生,我知道通过遍历DOM来实现这一点可能更可靠,但在这种情况下,regex更受欢迎。你知道我需要改变什么才能得到所有的结果,而不仅仅是一个吗 /[\s\s]+[\s\s]*?(([\s\s]*?)+[\s\s]*?/ Lorem ipsum dolor sit amet,是一位杰出的献身者。 耳道前庭。 拉库斯、萨皮恩、毛里斯等家族成员。 米塞纳斯在伊普苏姆
标记中的单词。我的正则表达式工作得很好,但只给了我第一个
,Lorem ipsum…
我对regex相当陌生,我知道通过遍历DOM来实现这一点可能更可靠,但在这种情况下,regex更受欢迎。你知道我需要改变什么才能得到所有的结果,而不仅仅是一个吗
/[\s\s]+[\s\s]*?(- ([\s\s]*?)+[\s\s]*?/
-
Lorem ipsum dolor sit amet,是一位杰出的献身者。
-
耳道前庭。
-
拉库斯、萨皮恩、毛里斯等家族成员。
-
米塞纳斯在伊普苏姆康塞特图,菲尼布斯埃特,调味品turpis。
在末尾添加全局g
标志。例如:
/<div class="foo-bar">[\s\S]+<ul>[\s\S]*?(<li>([\s\S]*?)<\/li>)+[\s\S]*?<\/ul>/g
/[\s\s]+[\s\s]*?(- ([\s\s]*?)+[\s\s]*?/g
您可能还需要区分大小写的i
标志最好将以下内容与preg\u match\u all()
一起使用。我刚测试过,它正在工作
首先preg\u match\u all
以下内容仅获取`
/<div class="foo-bar">([\s\S]*?)+<ul>([\s\S]*?)<\/ul>([\s\S]*?)<\/div>/
使用DOM+Xpath而不是正则表达式
$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.
"
你的PHP代码是什么样子的?不要使用正则表达式。使用解析器。要使用正则表达式,您需要提取完整的ul
,然后解析出每个li
。它们还不存在,只需原型化正则表达式即可。只需要像上面那样整理一个片段。请看:我也读过了。:)我仍然认为它适合你的问题,因为你可能要求一个正则表达式做太多的事情。PHP中没有g
。函数是否为全局函数。@chris85而不是g
您可以使用preg\u match\u all()
function@funilrys是的,函数是全局函数还是非全局函数。
仍然没有g
修饰符。@funillys是的preg\u match\u all()
仍然只匹配一个:(@Eamonn是的,这不是答案。正则表达式不能像你想要的那样工作。这就是我需要的,但它也需要
和
包装器来阻止它与其他东西匹配。@Eamonn我相信,在一个正则表达式中不可能做到这一点。将它分成两个正则表达式?看起来这就是解决方案。如果你想更新你的ans答案是我会接受的。@Eamonn编辑了我的答案。你能测试一下吗?答案很好。我做了。你可能不想使用XML解析器,但它是更好的解决方案。因此,我为可能有相同问题的其他人发布了更多答案,并找到了你的问题。
$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.
"