在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,,,"
有人可以帮助您改进此代码吗?
答案 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,,"
看看这是否适合您的情况。
答案 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