正则表达式 - 在数字之间排除“-”

Regex - exclude "-" between numbers

在 php 中,我需要验证来自 textarea 输入的任意数量的正数 and/or 负数。数字可以是浮点数,用逗号分隔。

有效:

",,,66,,78.8,-89.8,,0.0,,3.14," or "," or "67,89,10,0876,,"

在 regex101.com 的帮助下,我创建了这个正则表达式

^((-?\d+(\.\d+)?)|(,+))*$

在 php 我有这个代码

if (preg_match("/^((-?\d+(\.\d+)?)|(,+))*$/", $text))
{
    echo "yes";
} else 
{
    echo "no";
}

我的问题是,此正则表达式还验证“-”以及额外的“.”。在数字中。

这应该是无效的:

",,67.8,89.8787,78-89,-8,07,,33.33.33,,,"

有人可以帮助改进此代码吗?

您可以使用

/^,*(-?\d*\.?\d+)?(?:,+\g<1>)*,*$/

参见regex demo

详情

  • ^ - 字符串开始
  • ,* - 0+ 逗号
  • (-?\d*\.?\d+)? - 可选的捕获组 1 匹配一个浮点数(注意:如果你不想像浮点数那样匹配 .8,你可以保留原来的 \d+(?:\d+)?
  • (?:,+\g<1>)* - 重复 0 次以上
    • ,+ - 1+ 逗号
    • \g<1> - 捕获组 1 模式(这是一个 subroutine call,等于 (?1),用于重复第一个捕获组子模式)
  • ,* - 0+ 逗号
  • $ - 字符串结尾。

我会尝试这样的事情:

$my_string = ",,67.8,89.8787,78-89,-8,07,,33.33.33,,,";
$array = explode(",", $my_string);

foreach ($array as $value){
    if (preg_match("[regex_to_create]", $value))
    {
        echo "yes";
    } else 
    {
        echo "no";
    }
}

我更喜欢展开字符串,因为有时正则表达式对于长字符串可能会很棘手。

我将你的正则表达式修改为 ^(-?\d+(\.\d+)?,?)+$

现在它将验证像

这样的字符串
"66,78.8,-89.8,0.0,3.14"

但不是

",,,66,,78.8,-89.8,,0.0,,3.14,"

也不

"67,89,10,0876,,"

看看这是否适合您的情况。

这是测试:https://regex101.com/r/Ivah2H/1

你可以在没有正则表达式和 is_numeric 函数的帮助下做到这一点:

$numbers = array_filter(explode(',', ',,67.8,-89.8787,7889,-8,07,,33.33.33,,,'));
$validate = true;
foreach ($numbers as $number) {
    if (!is_numeric($number)) {
        $validate = false;
        break;
    }
}

var_dump($validate); // false