正则表达式 - 排除" - "数字之间

时间:2018-05-17 12:22:33

标签: php regex preg-match

在php中我需要从textarea输入任意数量的正数和/或负数。数字可以是浮点数,也可以用逗号分隔。

有效的:

",,,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,,,"

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

4 个答案:

答案 0 :(得分:1)

您可以使用

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

请参阅regex demo

<强>详情

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

答案 1 :(得分:1)

我会尝试这样的事情:

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

我更喜欢爆炸字符串,因为有时使用长字符串可以使用正则表达式。

答案 2 :(得分:0)

我将你的正则表达式修改为^(-?\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

答案 3 :(得分:0)

您可以在没有正则表达式的情况下并在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