正则表达式因小数位 (.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 正确
- 10.01 return 错误
谁能解释一下区别?为什么 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}))?$
我的表格中有一个奖品输入字段。有效的用户输入应始终如下所示:
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 正确
- 10.01 return 错误
谁能解释一下区别?为什么 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}))?$