PHP Regex正则表达式preg_match()仅允许带逗号的数字

时间:2018-06-25 23:50:49

标签: php regex

我问过了,但得到了答复,但是现在,几年之后,它不起作用了。 我什至尝试过在线正则表达式验证器。不知道发生了什么。

版本:64位操作系统上的PHP 7.0.30

该字符串应仅允许带逗号的数字。 开头或结尾没有逗号。 逗号之间的空格可以,但是我宁愿不允许。

以下内容未通过

我的正则表达式是:

$DateInvoicedIDs = "1031,453,808,387,111,342,962,706,251,442,362,858,950,738,310,288,99,665,1023,30,894,112,132,148,347,895,382,94,766,683,276,1104,658,34,348,235,786,769,2";

$reg = '/[0-9\s]+(,[0-9\s]+)*[0-9]$/';
if ( preg_match($reg, $DateInvoicedIDs) ) {
  echo = $DateInvoicedIDs;
} else { echo "false"; }

我正在使用preg_match并得到虚假消息。

有什么主意吗?

3 个答案:

答案 0 :(得分:1)

https://regex101.com/r/3TVmOv/1上测试您的字符串和模式

加载后,您会看到没有突出显示的匹配项。

然后在字符串的末尾添加一个数字,然后哇!这是因为(,[0-9\s]+)*与最后的2相匹配,并且[0-9]$不能满足,因为需要另一个数字。

如果我了解您的逻辑/要求,我认为我会使用~^\d+(?:\s*,\s*\d+)*$~

这改进了验证,因为它不允许在逗号之间使用数字和空格混合,例如:2, 3 4 56, 72我认为您不希望在逗号分隔的数值中使用空格。

Pattern Demo

代码:(Demo

$DateInvoicedIDs = "1031,453,808,387,111,342,962,706,251,442,362,858,950,738,310,288,99,665,1023,30,894,112,132,148,347,895,382,94,766,683,276,1104,658,34,348,235,786,769,2";

$reg = '/^\d+(?:\s*,\s*\d+)*$/';
if (preg_match($reg, $DateInvoicedIDs)) {
    echo $DateInvoicedIDs;
} else {
    echo "false";
}

答案 1 :(得分:0)

由于正则表达式中的最后一个[0-9],因此不匹配。 *中的(,[0-9\s]+)*是一个贪婪的匹配项,这意味着它消耗了所有逗号和字符串中的数字。与最后一个[0-9]匹配之后,就什么也没有了。

因此,您可能希望将正则表达式减少为'/[0-9\s]+(,[0-9\s]+)*$/

答案 2 :(得分:0)

正则表达式[0-9]$的最后一部分是导致其失败的原因:

[0-9\s]+仅匹配第一个数字1031,

(,[0-9\s]+)*涵盖了,2之前的所有内容,因为它是逗号之后的单个数字,这正是它要查找的内容

然后[0-9]$试图再找到一个数字,但找不到

如果最后一个数字是两位数,即,25而不是2,则第二部分(,[0-9\s]+)*将得到满足,因为它找到了至少一个数字,并且{ {1}}将匹配下一个数字[0-9]$https://regex101.com/r/0XbHsw/1

为最后一部分添加5将解决问题:?