is_numeric、intval、ctype__digit.. 你能依赖它们吗?
还是我必须使用正则表达式?
函数 isNum($str) {
return (preg_match("/^[0-9]+$/", $str));
}
你们有什么感想?我傻吗?
ctype_digit
和之间的一个重要区别is_numerict
是负值和浮点数。
is_numeric(-10)
将返回true
而 'ctype_digit(-10)' 将是false
也ctype_digit(12.50)
将返回false
而
is_numeric(12.50)
将是true
所以它们都很方便取决于你的域逻辑的上下文。
is_numeric、intval 和 ctype_digit 都做了非常不同的事情。
is_numeric将告诉您变量的内容是否为数字(即如果它是浮点或整数值则为真)。
intval尝试将一串数字转换为整数值
ctype_digit将告诉您字符串是否只包含数字字符(将执行与 isNum 函数相同的检查)。
最好的方法可能是检查 is_numeric 是否为真,然后使用 settype($myvalue, 'integer') 或 intval($myvalue);
您命名了两种函数:
Validator检查给定值是否具有给定特征并返回true或false。
is_numeric
,ctype_*
函数和你的isNum
函数是验证函数,因为它们只是告诉你一个值是否有效。
过滤器以新值具有给定特征的方式更改给定值,因此将是有效的。
intval
并且这些filter_*
函数是过滤函数,因为它们总是会返回可以通过验证器的有效值。
You can also use the new filter functions.
if (!$var = filter_var($var, FILTER_VALIDATE_INT)) {
die('Not an int!');
}
echo "Var has the value $var.\n";
Best used when filtering input from cli, web client, etc. List of filters here.
按照文档。is_numeric
将始终可用,并且仅验证您有一个可以被 PHP 视为数字的字符串。这些ctype_*
功能的范围有点窄,但也应该始终可用。
IMO 对此类检查来说,RegEx 是矫枉过正的。
我不是 PHP 专家,但您是否考虑过编写数据驱动的单元测试来具体了解这些功能。如果您不确定它们的可靠性并且文档不清楚,那么没有什么比可以测试 1000 个排列及其预期输出的单元测试更好的了。
您甚至不必像我想象的那样走那么远,您只想测试一些特殊的边缘情况。您的编程技能和编译器是您最好的朋友。您编写的程序将确认或否认您的怀疑。
此外,为了获得奖励,您可以监控每种方法需要多长时间,并查看哪种方法性能更高。
只是一个想法。
我不确定你为什么不只使用intval。毕竟,您的正则表达式甚至没有考虑负数,而 intval 会(尽管也许这就是您想要的?)。
或者甚至只是强制转换为 int,这样可以避免一些深奥的浮点“陷阱”,这些问题可能会与 intval 一起偷偷摸摸。