因此用户可能会搜索“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”所以我显然在这里做错了什么,但是什么?
答案 0 :(得分:1)
如果斜线或连字符是你唯一关心的事情,那就应该这样做:
'#(?<![\d/-])(\d+)\s+mbit#i`
正则表达式的问题是\d+
只需匹配一位数。它与10
中的10/10 mbit
不匹配,因为它前面有斜杠,但0
不是。{1}}。为了确保它与数字的开头匹配,您必须在\d
列出之前不能包含的内容。
答案 1 :(得分:0)
你回顾断言是消极的。它告诉字符串不应该以/
开头所以/在字符串中匹配(因为正则表达式只能匹配“10”:你用断言明确地禁止它)。也许你想要一个积极的外观?