Php Regex表示货币,除非金额为0或00,否则没有前导零



嗨,我正在尝试为货币创建正则表达式。小数点后的部分工作正常。然而,我对第一部分有问题。我希望它能接受以下数字:

00.12
0.12
00
0

但不是像这样以零开头的数字

0012.12
00023

这就是我所拥有的,但我无法让它工作

^([1-9][0-9]*|0|00)+(.(d){2})?$

您需要删除第一个捕获组上的量词+——它将允许多次重复000。换句话说,000000000000等将被视为有效的字符串的前导部分。分组允许三种类型中的任何一种。所以像这样的正则表达式

^(0{1,2}|[1-9]d*)([.]dd)?$

将实现您的目标。

https://regex101.com/r/Tb1x6x/2/

您只需要从字符串的前面检查是否有1个或多个后面跟着1到9位的零。这种逻辑意味着所需的regex模式可以保持非常简单。

代码:(演示(

$tests = [
'00.12',
'0.12',
'00',
'0',
'0012.12',
'00023',
];
foreach ($tests as $test) {
echo $test . (preg_match('~^0+[1-9]~', $test) ? ' fail' : ' pass') . "n";
}

输出:

00.12 pass
0.12 pass
00 pass
0 pass
0012.12 fail
00023 fail

为了纠正你的完整模式,你不需要第一组上的量词:(演示(

echo preg_match('~^(?:[1-9]d*|0{1,2})(?:.d{2})?$~', $test) ? ' pass' : ' fail'

但老实说,为什么不把它们当作浮点数,而不是拒绝带前导零的值呢?(演示(为了更好的用户体验,我可能会这么做。或者只是用number_format()标准化输入数字。(演示(听起来可能是XY问题。

[编辑]

现在,我的答案符合实际要求:

^(0{1,2}|([1-9][0-9]*))(?:.[0-9]{2})?$

您可以在此处尝试:https://regex101.com/r/8KJhk3/5

相关内容

  • 没有找到相关文章

最新更新