Regex处理十进制数字失败(.00)导致preg_match()返回FALSE


Regex fails with decimal digits (.00) causes preg_match() to return FALSE

我的表单中有一个奖品输入字段。有效的用户输入应该是这样的:

1.00
0.00
10000.20
100.25

在浮点数之前可以有无限个数字,在只有2个数字之后。我尝试用regex:

来实现这一点
/^([0-9]+)'.([0-9]{2})$/

如果你在这里检查:https://regex101.com/有一个匹配的值10.00

但是现在在PHP中我使用preg_match()如下:

!preg_match('/^([0-9]+)'.([0-9]{2})$/', $obj->getPrize());
  • 10.00返回true
  • 10.01返回false

谁能解释一下这两者的区别?为什么10.00返回true?我认为preg_match()处理零不同,但如何实现这个任务?

你的问题不是正则表达式。这是你的数字,因为如果你最后没有任何必要的数字,PHP会把你的0剪掉。您可以通过下面的代码看到:

$num = 10.00;
var_dump($num);
$num = 10.01;
var_dump($num);
输出:

float(10)
float(10.01)

在第一个输出中可以看到,没有.00,因为它后面没有任何数字。但是你的regex需要.之后的2个数字,这就是为什么你的regex失败的原因。

现在一个解决方案是将'.([0-9]{2})设置为可选的,例如

^([0-9]+)(?:'.([0-9]{2}))?$