我问过了,但得到了答复,但是现在,几年之后,它不起作用了。 我什至尝试过在线正则表达式验证器。不知道发生了什么。
版本: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
并得到虚假消息。
有什么主意吗?
答案 0 :(得分:1)
在https://regex101.com/r/3TVmOv/1上测试您的字符串和模式
加载后,您会看到没有突出显示的匹配项。
然后在字符串的末尾添加一个数字,然后哇!这是因为(,[0-9\s]+)*
与最后的2
相匹配,并且[0-9]$
不能满足,因为需要另一个数字。
如果我了解您的逻辑/要求,我认为我会使用~^\d+(?:\s*,\s*\d+)*$~
这改进了验证,因为它不允许在逗号之间使用数字和空格混合,例如:2, 3 4 56, 72
我认为您不希望在逗号分隔的数值中使用空格。
代码:(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
将解决问题:?