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