正则表达式看起来匹配互联网速度

时间:2010-04-20 10:30:05

标签: php regex

因此用户可能会搜索“10 mbit”,之后我想捕获“10”,这样我就可以在速度搜索而不是字符串搜索中使用它。这不是问题,下面的正则表达式做得很好:

if (preg_match("/(\d+)\smbit/", $string)){ ... }

但是,用户可能会搜索“10/10 mbit”或“10-100 mbit”之类的内容。我不想与上面的正则表达式相匹配 - 它们应该以另一种方式处理。所以我希望匹配“10 mbit”的正则表达式,如果数字是全数字作为整个单词(即由空格,换行符或lineend / linestart包含)

使用lookbehind,我这样做了:

if (preg_match("#(?<!/)(\d+)\s+mbit#i", $string)){

只是为了捕捉那些没有“/”的人,但是这个字符串匹配为真:“10/10 mbit”所以我显然在这里做错了什么,但是什么?

2 个答案:

答案 0 :(得分:1)

如果斜线或连字符是你唯一关心的事情,那就应该这样做:

'#(?<![\d/-])(\d+)\s+mbit#i`

正则表达式的问题是\d+只需匹配一位数。它与10中的10/10 mbit不匹配,因为它前面有斜杠,但0不是。{1}}。为了确保它与数字的开头匹配,您必须在\d列出之前不能包含的内容。

答案 1 :(得分:0)

你回顾断言是消极的。它告诉字符串不应该以/

开头

所以/在字符串中匹配(因为正则表达式只能匹配“10”:你用断言明确地禁止它)。也许你想要一个积极的外观?