在我尝试捕获此HTML中的某些数据时,我遇到了正则表达式的问题:
<ul>
<li>Nombre de mots à traduire : 41 mots.</li>
<li>Nombre de mots partiellement traduits : 164 mots.</li>
<li>Nombre de mots traduits : 792 mots.</li>
<li>Nombre de correspondances exactes : 808 mots.</li>
<li>Nombre de répétitions internes : 71 mots.</li>
<li>Total : 1876 mots.</li>
</ul>
我需要在PHP Regex中获取每个<li>
的'mots'数量,但 :
它与数字粘在一起,我无法得到它。
我正在尝试使用第一个(?<=\btraduire : \s)(\w+)
,但它没有意义......我无法以任何方式修改HTML,我无法使用html_entity_decode()
这个HTML动态变化,我的意思是这个数字的长度会改变,这只是一个例子。
有什么想法吗?
编辑:
好的(\d+)\smots
我可以得到它! = D但如果我有:
<p>
Langue source : FRA (FRA)<br/>
Langue cible : ESP (ESP)
</p>
我想得到“FRA(FRA)”和“ESP(ESP)”,任何想法?
答案 0 :(得分:1)
如果每个mots
需要<li>
的数量,您应该使用这样的正则表达式:
(\d+)\smots
但请注意,如果你试图解析HTML,你可能最好使用HTML解析器,因为正则表达式很难用非常规语法(即HTML,XML)
<强>更新强>
对于您的第二个查询,我会尝试这样的事情:
Langue.*([A-Z]{3})\s\(\1\)
在上面,第一个捕获组应该是语言。正则表达式的最后部分中的\1
指的是第一个捕获组,这意味着FRA (FRA)
将匹配,但FRA (BLA)
不匹配。
答案 1 :(得分:1)
您可以使用:
preg_match_all('~[0-9]+(?= mots.</li>)~', $html, $matches);
print_r($matches);
或更明确:
preg_match_all('~(?J)<li>(?:Nombre de (?<what>[^&]++)|(?<what>Total))[^0-9]+(?<quantity>[0-9]+)[^<]*</li>~i', $html, $matches, PREG_SET_ORDER);
print_r($matches);
为了您的编辑:
preg_match_all('~Langue (?<target>[^&\s]++);: \s*(?<language>[^\r\n<]+)\s*~i', $html, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
printf("\n%s\t%s", $match['target'], $match['language']);
}