是数字还是数字preg_match?

5

我在论坛上看到说不能完全信任 is_numeric()。例如它会让 "0xFF" 这样的十六进制数通过...

所以我的问题是,你能够欺骗 is_numeric 吗?我需要使用正则表达式才能正确处理吗?

5个回答

12

is_numeric()函数认为以下字符串是数字:

数字字符串可以包含可选符号、任意数量的数字、可选小数部分和可选指数部分。因此,+0123.45e6 是一个有效的数字值。十六进制表示法(0xFF)也是被允许的,但是只能没有符号、小数和指数部分。

如果你只想检查一个字符串是否只由十进制数字0-9组成,你可以使用ctype_digit()函数。


有点滑稽的是,VB.NET开发人员因为.NET允许正确的数据类型检查而受到了使用ctypes的责备,但在PHP中,这是首选的方式。 - TravisO

2

我们也可以使用 ctype_digit() 来检查一个字符串是否是真正的数字。


0

正则表达式显然是更好的选择,但它会带来额外的开销。因此,这真的取决于您的情况和您想要做什么。


0

这是用于验证用户输入吗?那么使用正则表达式或断言它不包含“x”并且 is_numeric() 的开销不会太大。


0
如果你只是想检查某个东西是否为整数,可以尝试这样做:
function isInteger($value){
    return (is_numeric($value) ? intval($value) == $value : false);
}

如果你想检查浮点数,那么这个方法显然行不通 :)

1
为什么不简单地使用 return is_numeric( $value ) && intval( $value ) == $value?更易读。 - Rob

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