带有“”的正则表达式粘在内容上

时间:2013-12-06 17:17:18

标签: php regex

在我尝试捕获此HTML中的某些数据时,我遇到了正则表达式的问题:

<ul>
       <li>Nombre de mots à traduire&nbsp;:&nbsp;41 mots.</li>
       <li>Nombre de mots partiellement traduits&nbsp;:&nbsp;164 mots.</li>
       <li>Nombre de mots traduits&nbsp;:&nbsp;792 mots.</li>
       <li>Nombre de correspondances exactes&nbsp;:&nbsp;808 mots.</li>
       <li>Nombre de répétitions internes&nbsp;:&nbsp;71 mots.</li>
       <li>Total&nbsp;:&nbsp;1876 mots.</li>
</ul>

我需要在PHP Regex中获取每个<li>的'mots'数量,但&nbsp;:&nbsp;它与数字粘在一起,我无法得到它。

我正在尝试使用第一个(?<=\btraduire&nbsp;:&nbsp;\s)(\w+),但它没有意义......我无法以任何方式修改HTML,我无法使用html_entity_decode()

这个HTML动态变化,我的意思是这个数字的长度会改变,这只是一个例子。

有什么想法吗?

编辑: 好的(\d+)\smots我可以得到它! = D但如果我有:

<p>
    Langue source&nbsp;:&nbsp;FRA (FRA)<br/>
    Langue cible&nbsp;:&nbsp;ESP (ESP)
</p>

我想得到“FRA(FRA)”和“ESP(ESP)”,任何想法?

2 个答案:

答案 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]++);:&nbsp;\s*(?<language>[^\r\n<]+)\s*~i', $html, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
    printf("\n%s\t%s", $match['target'], $match['language']);
}