我试过了:
preg_match("/((\d)+,?)+/",$string)
它返回正确的结果:
1,2,3,4,5
但它也匹配:
1,2a
1aaaa
1,2,3,
我怎样才能解决这个问题?
你可以做
^\d+(,\d+)*$
第一个^\d+
匹配字符串的开头和一个数字。然后,您可以选择匹配一个逗号后跟一个数字(并且该组可以出现 0 次或多次)。最后$
匹配字符串的结尾。确保在最后一个数字之后没有任何剩余。
这是一个显示表达式如何工作的状态机:
这可以匹配例如 : 8
, 1,2,4
.
但不会匹配 : 8,
,,2
或1,2a
您可以使用锚点^
并$
阻止其他匹配:
preg_match("/^((\d)+,?)+$/",$string)
^ ^
虽然......你的表达可能会更好:
preg_match("/^\d+(,\d+)*$/",$string)
发生的事情((\d)+,?)+
是它匹配它找到的前几个字符,一旦完成,它就会说它匹配。
锚点^
和$
分别表示字符串的开头和结尾,表示开头必须匹配到结尾。
尝试这个:
preg_match('~^(?:\d+(?:,(?!$)|$))+$~', $string);