PHP中的正则表达式:验证坐标输入

时间:2017-12-20 17:54:04

标签: php regex

我的问题是我正在尝试验证在表单上提交的输入为分号分隔坐标。我只想接受具有以下模式的数据:

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;
}

这符合我的模式,但是当分号位于错误的位置时它也匹配。

我真的很感激帮助。

1 个答案:

答案 0 :(得分:2)

代码

See regex in use here

^(\d+,\d+)(?:;(?1))*$

它与^\d+,\d+(?:;\d+,\d+)*$几乎相同,除了:

  1. 您定义模式一次并重复使用
  2. 它更短
  3. 稍微较慢(因此使用^\d+,\d+(?:;\d+,\d+)*$可能会提高效果)
  4. 另外,请注意,将(?:;\d+,\d+)*放在最后可以提高性能(而不是像刚开始那样)。

    说明

    • ^在行首处断言位置
    • (\d+,\d+)将以下内容捕获到捕获组1中
      • \d+匹配一个或多个数字
      • ,按字面意思匹配
      • \d+匹配一个或多个数字
    • (?:;(?1))*符合以下任意次数
      • ;按字面意思匹配
      • (?1)递归第一个子模式(捕获组1的内容)
    • $断言行尾的位置