PHP中的正则表达式:验证坐标输入[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

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

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

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

我真的很感激帮助。

php regex
1个回答
2
投票

See regex in use here

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

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

  1. 您可以定义模式一次并重复使用它
  2. 它更短
  3. 它稍慢(因此使用^\d+,\d+(?:;\d+,\d+)*$可能会提高性能)

另外,请注意将(?:;\d+,\d+)*放在最后可以提高性能(而不是像开始那样)。


说明

  • ^在线的开头断言位置
  • (\d+,\d+)将以下内容捕获到捕获组1中 \d+匹配一个或多个数字 ,按字面意思对比 \d+匹配一个或多个数字
  • (?:;(?1))*匹配以下任意次数 ;按字面意思对比 (?1)递归第一个子模式(捕获组1的内容)
  • $在线的末尾断言位置
© www.soinside.com 2019 - 2024. All rights reserved.