正则表达式因小数位 (.00) 而失败导致 preg_match() 变为 return FALSE

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

我的表格中有一个奖品输入字段。有效的用户输入应始终如下所示:

1.00
0.00
10000.20
100.25

浮点数前可以无限位,浮点后只有2位。我试图用那个正则表达式来实现这个:

/^([0-9]+)\.([0-9]{2})$/

如果您在此处查看:https://regex101.com/ 匹配值 10.00

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

!preg_match('/^([0-9]+)\.([0-9]{2})$/', $obj->getPrize());

谁能解释一下区别?为什么 10.00 return 是真的?我认为 preg_match() 以不同方式处理零,但如何完成此任务?

你的问题不是正则表达式。这是你的数字,因为如果你最后没有任何必要的数字,PHP 只会修剪你的 0。您可以使用以下代码查看:

$num = 10.00;
var_dump($num);

$num = 10.01;
var_dump($num);

输出:

float(10)
float(10.01)

正如您在第一个输出中看到的那样,没有 .00 只是因为您后面没有任何数字。但是您的正则表达式在 . 之后需要 2 位数字,这就是您的正则表达式失败的原因。

现在一个解决方案可以是使 \.([0-9]{2}) 可选,例如

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