我的问题是我正在尝试验证在表单上提交的输入为分号分隔坐标。我只想接受具有以下模式的数据:
1,2
1,2;3,4
1,2;3,4;5,6
等......直到任何坐标长度。
如果分号或逗号位于错误的位置,它应该会失败...
e.g。 1;2;3,4
我对正则表达式和PHP都很陌生。我用regex101.com来提出我一直在尝试的东西:
if (!preg_match('/(\d+,\d+;)*\d+,\d+/', $coordinateData)) {
return;
}
这符合我的模式,但是当分号位于错误的位置时它也匹配。
我真的很感激帮助。
答案 0 :(得分:2)
^(\d+,\d+)(?:;(?1))*$
它与^\d+,\d+(?:;\d+,\d+)*$
几乎相同,除了:
^\d+,\d+(?:;\d+,\d+)*$
可能会提高效果)另外,请注意,将(?:;\d+,\d+)*
放在最后可以提高性能(而不是像刚开始那样)。
^
在行首处断言位置(\d+,\d+)
将以下内容捕获到捕获组1中
\d+
匹配一个或多个数字,
按字面意思匹配\d+
匹配一个或多个数字(?:;(?1))*
符合以下任意次数
;
按字面意思匹配(?1)
递归第一个子模式(捕获组1的内容)$
断言行尾的位置