我正在尝试验证一个包含3个数字的字符串,然后是/然后再增加5个数字 我以为这会起作用
(/^([0-9]+[0-9]+[0-9]+/[0-9]+[0-9]+[0-9]+[0-9]+[0-9])/i)
但它没有,任何想法我做错了
答案 0 :(得分:5)
试试这个
preg_match('@^\d{3}/\d{5}@', $string)
您的工作不起作用的原因是+
符号与指定字符或字符类中的“一个或多个”匹配。
此外,当使用正斜杠分隔符(表达式的开头和结尾处的字符)时,您需要通过在前缀中添加反斜杠来转义模式中的任何正斜杠,例如
/foo\/bar/
PHP允许您使用备用分隔符(如我的答案中所示),如果您的表达式包含许多正斜杠,这将很方便。
答案 1 :(得分:1)
首先,您使用/
作为正则表达式分隔符,因此您无法在模式中使用它而不使用反斜杠转义它。否则,PHP会认为你的模式在中间的/
结束(你可以看到,即使是StackOverflow的语法高亮也是如此)。
其次,+
是“贪婪的”,并且会匹配尽可能多的字符,因此第一个[0-9]+
将匹配前一个3个数字,不会留下接下来的两个匹配。
第三,没有必要使用i
,因为你处理的数字不是大写或小写的,所以区分大小写是一个没有实际意义的点。
试试这个
/^\d{3}\/\d{5}$/
\d
是写[0-9]
的简写,{3}
和{5}
分别重复3或5次。
(此模式锚定在字符串的开头和结尾。您的模式仅锚定到开头,如果这是故意的,则从我的模式中删除$
)
答案 2 :(得分:1)
我最近发现这个网站对调试regex有用: http://www.regextester.com/index2.html
它假设使用/.../
(意味着你不应该在你粘贴的正则表达式中包含那些斜杠)。
因此,在我将正则表达式^([0-9]+[0-9]+[0-9]+/[0-9]+[0-9]+[0-9]+[0-9]+[0-9])
放入正则表达式框并在“测试”框中123/45678
后,我看不到匹配项。当我在中间的正斜杠前放一个反斜杠时,它会识别匹配。然后,您可以尝试匹配1234/567890
并发现它仍匹配。然后你通过并删除所有加号然后它正确地停止匹配。
我对这个特定网站特别喜欢的是它以红色显示部分匹配的方式,让您可以看到正则表达式的工作位置。