PHP正则表达式 - 合法的浮点数

21

我希望用户只能输入0-9和一个小数点。

 patt = /[^0-9(.{1})]/

 1.2222 -> true
 1.2.2  -> false (only once '.')

帮帮我,谢谢!

8个回答

25
/^-?(?:\d+|\d*\.\d+)$/

这个匹配普通的浮点数,例如3.14,只有小数部分的简写,例如.5和整数,例如9,以及负数。


1
你需要将替换项括在括号中,否则字符串开头的锚点只能与整数匹配,而字符串结尾的锚点只能与小数匹配。 - Tim Pietzcker

24

这就是你正在寻找的内容

$re = "~        #delimiter
    ^           # start of input
    -?          # minus, optional
    [0-9]+      # at least one digit
    (           # begin group
        \.      # a dot
        [0-9]+  # at least one digit
    )           # end of group
    ?           # group is optional
    $           # end of input
~xD";

这个只接受"123"或者"123.456",不接受".123"或者"14e+15"。如果你也需要这些格式,请尝试is_numeric函数。


@AntonioCS 这是用于$结束定界符的。 有关PCRE修饰符的参考 D (PCRE_DOLLAR_ENDONLY) 如果设置了此修饰符,则模式中的美元元字符仅在主题字符串的末尾匹配。如果没有此修饰符,则美元符号也会在最后一个字符之前立即匹配,如果它是换行符(但不是在任何其他换行符之前)。如果设置了m修饰符,则忽略此修饰符。在Perl中没有相当于此修饰符的内容。 FYI:x用于扩展:用于抑制任何空格字符。 - MediaVince

9
正则表达式用于匹配字符串模式。如果您并非明确要验证输入字符串的格式(而是实际值),您也可以使用。
filter_var("1.33", FILTER_VALIDATE_FLOAT);

确保输入可以用作浮点数值。如果不是浮点数,则返回FALSE,否则返回浮点数或整数值。适用任何类型转换规则。

这不符合原帖的要求/描述:例如它允许123e-4 - salathe
@salathe是的,就像我刚才说的那样:在你需要获取时使用它。如果你只是想验证字符串格式,就不要使用它。123e-4仍然是一个浮点数(0.123)。 - Gordon

7
这个正则表达式:
\d*(?:\.\d+)?

将会给出结果:

123 -> true
123.345 -> true
123. -> true
.345 -> true
0.3345 -> true

但是,在使用正则表达式之前,您必须检查输入是否为空,因为正则表达式还允许零长度的输入。


3

您可以使用is_numeric()函数,但需要注意它接受的参数比通常需要的要多一些(例如1e4)。


2
我写了以下正则表达式,目前看来对我的测试输入效果最佳: /^-?(\d|[1-9]+\d*|\.\d+|0\.\d+|[1-9]+\d*\.\d+)$/ 它使用前两个选择项匹配整数: \d|[1-9]+\d* 然后查找像 .5、.55、.05 等以 . 开头的数字。 \.\d+ 接下来查找与上一个相同但在 . 前面加了 0 的数字。 0\.\d+ 最后查找整数和小数部分的模式,例如 5.5、5.05 等。 [1-9]+\d*\.\d+ 您可以在此链接中测试正则表达式: 验证浮点数 - regex101

1

这些字符类都不是必需的。 - mickmackusa

0

如果你没有正则表达式的经验,为什么不直接使用is_numeric呢?

关于你的正则表达式:.匹配所有字符,\.匹配一个点。 {1}是不必要的。而且我也不知道你试图用[^ ... ]做什么。如果你真的想在代码中使用正则表达式,请阅读正则表达式教程


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接