Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP正则表达式preg_match()只允许带逗号的数字_Php_Regex - Fatal编程技术网

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

PHP正则表达式preg_match()只允许带逗号的数字,php,regex,Php,Regex,我已经问过了,答案是肯定的,但是现在,几年后,它不起作用了。 我甚至尝试过在线正则表达式验证器。不知道发生了什么事 版本:64位操作系统上的PHP7.0.30 字符串应仅允许使用带逗号的数字。 开头或结尾没有逗号。 逗号之间的空格可以,但我不允许 以下内容没有通过 我的正则表达式是: $DateInvoicedIDs=“10314538083871113429627062514423628589505073810288,996651023,30894112132148347895382,9476

我已经问过了,答案是肯定的,但是现在,几年后,它不起作用了。 我甚至尝试过在线正则表达式验证器。不知道发生了什么事

版本:64位操作系统上的PHP7.0.30

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

以下内容没有通过

我的正则表达式是:

$DateInvoicedIDs=“10314538083871113429627062514423628589505073810288,996651023,30894112132148347895382,947666832761104658,34348235786769,2”

我正在使用
preg\u match
并得到false


有什么想法吗?

它不匹配,因为您的正则表达式中最后一个
[0-9]
(,[0-9\s]+)*
中的
*
是一个贪婪的匹配,这意味着它正在使用字符串中后跟数字的所有逗号。在与最后一个
[0-9]
匹配之后,没有剩余内容


因此,您可能希望将正则表达式简化为
'/[0-9\s]+(,[0-9\s]+)*$/
正则表达式的最后一部分是导致它失败的原因:

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

(,[0-9\s]+)*
涵盖了所有内容,直到
,2
,因为它是一个逗号后面的单个数字,而逗号正是它所寻找的

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

如果最后一个数字是两位数,即
,25
而不是
2
,则第二部分
(,[0-9\s]+)*
将得到满足,因为它找到了至少一个数字,
[0-9]$
将匹配下一个数字
5
()


为最后一部分添加
可以解决问题:
[0-9\s]+(,[0-9\s]+)*[0-9]?$
测试字符串和模式@

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

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

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

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

代码:()


字符串可以以空格结尾,还是只能以数字结尾?可能是
^\d+[\d\s]*(?如果末尾允许空白。
$reg = '/[0-9\s]+(,[0-9\s]+)*[0-9]$/';
if ( preg_match($reg, $DateInvoicedIDs) ) {
  echo = $DateInvoicedIDs;
} else { echo "false"; }
$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";
}