这对我来说不是一个大问题(据我所知),这更像是我感兴趣的东西。但是使用is_numeric
而不是preg_match
(反之亦然)来验证用户输入值的主要区别是什么(
示例一:
<?php
$id = $_GET['id'];
if (!preg_match('/^[0-9]*$/', $id)) {
// Error
} else {
// Continue
}
?>
示例二:
<?php
$id = $_GET['id'];
if (!is_numeric($id)) {
// Error
} else {
// Continue
}
?>
我认为两者都完全一样,但是有什么具体的差异可能会在某种程度上引起问题吗?是否有一种“最好的方式”或者我没有看到的东西使它们与众不同。
答案 0 :(得分:61)
is_numeric()
测试值是否为数字。它不一定必须是整数 - 它可以是十进制数字或科学记数法中的数字。
您提供的preg_match()
示例仅检查值是否包含0到9的数字;任何数量的,以任何顺序。
请注意,您提供的正则表达式也不是完美的整数检查器,就像您编写它一样。它不允许否定;它确实允许一个零长度的字符串(即根本没有数字,这可能不应该是有效的?),并且它允许该数字具有任意数量的前导零,这也可能不是预期的。
[编辑]
根据您的评论,更好的正则表达式可能如下所示:
/^[1-9][0-9]*$/
这会强制第一个数字仅在1到9之间,因此您不能有前导零。它还强制它至少长一个数字,因此解决了零长度字符串问题。
你并不担心负面因素,所以这不是问题。
您可能希望限制位数,因为事实上,它将允许太大的字符串不能存储为整数。要对此进行限制,您可以将星形更改为长度限制,如下所示:
/^[1-9][0-9]{0,15}$/
这将允许字符串长度在1到16位之间(即第一个数字再加上0-15个数字)。您可以根据自己的需要随意调整花括号中的数字。如果你想要一个固定长度的字符串,那么你只需要在括号中指定一个数字。
希望有所帮助。
答案 1 :(得分:11)
根据http://www.php.net/manual/en/function.is-numeric.php,is_numeric类似于“+ 0123.45e6”或“0xFF”。我认为这不是你所期望的。
preg_match可能很慢,你可以使用像0000或0051这样的东西。
我更喜欢使用ctype_digit(仅适用于字符串,可以使用$ _GET)。
<?php
$id = $_GET['id'];
if (ctype_digit($id)) {
echo 'ok';
} else {
echo 'nok';
}
?>
答案 2 :(得分:7)
is_numeric()允许任何形式的数字。所以1
,3.14159265
,2.71828e10
都是“数字”,而你的正则表达式相当于is_int()
答案 3 :(得分:5)
is_numeric将接受“-0.5e + 12”作为有效ID。
答案 4 :(得分:5)
不完全相同。
来自is_numeric的PHP文档:
'42' is numeric
'1337' is numeric
'1e4' is numeric
'not numeric' is NOT numeric
'Array' is NOT numeric
'9.1' is numeric
使用正则表达式,您只需检查“基本”数值。
同样is_numeric()
应该更快。
答案 5 :(得分:5)
is_numeric检查它是否是任何类型的数字,而你的正则表达式检查它是否是一个整数,可能是前导0。对于存储为整数的id,很可能我们不希望前导0。按照Spudley的回答,我们可以做到:
/^[1-9][0-9]*$/
然而,正如Spudley所说,结果字符串可能太大而无法存储为32位或64位整数值。带符号的32位整数的最大值为2,147,483,647(10位),带符号的64位整数的最大值为9,223,372,036,854,775,807(19位)。但是,许多10和19位整数分别大于最大32位和64位整数。一个简单的正则表达式解决方案是:
/^[1-9][0-9]{0-8}$/
或
/^[1-9][0-9]{0-17}$/
分别是,但这些“解决方案”不幸地限制每个9和19位整数;几乎没有令人满意的结果。更好的解决方案可能是:
$expr = '/^[1-9][0-9]*$/';
if (preg_match($expr, $id) && filter_var($id, FILTER_VALIDATE_INT)) {
echo 'ok';
} else {
echo 'nok';
}
答案 6 :(得分:3)
is_numeric
检查更多内容:
查找给定变量是否为数字。数字字符串组成 可选符号,任意位数,可选小数部分和 可选的指数部分。因此+ 0123.45e6是有效的数值。 也允许使用十六进制表示法(0xFF),但只能使用无符号, 十进制和指数部分。
答案 7 :(得分:1)
如果你只检查它是否是一个数字,is_numeric()
在这里更好很多。它比正则表达式更具可读性和快速性。
你的正则表达式的问题在于它不允许使用十进制值,所以基本上你只是在正则表达式中编写了is_int()
。只有在输入中存在非标准数据格式时才应使用正则表达式; PHP有很多内置的验证功能,甚至是email validator without regex。
答案 8 :(得分:1)
PHP的is_numeric函数允许浮点数和整数。同时,如果要验证表单数据(仅限字符串),则is_int函数太严格。因此,您通常最好使用正则表达式。
严格来说,整数是正数和负数,也包括零。这是一个正则表达式:
/ ^ 0 $ |?^ [ - ] [1-9] [0-9] * $ /
或者,如果你想允许前导零:
/ ^ [ - ] [0] | [1-9] [0-9] $ /
请注意,这将允许使用-0000这样的值,但不会导致PHP出现问题。 (MySQL也会将这些值转换为0。)
您可能还想限制整数的长度,以考虑32/64-bit PHP platform features和/或数据库兼容性。例如,要将整数的长度限制为9位(不包括可选的 - 符号),您可以使用:
/ ^ 0 $ |?^ [ - ] [1-9] [0-9] {0,8} $ /
答案 9 :(得分:0)
同时,上面的所有值都只会将值限制为整数, 所以我用
/^[1-9][0-9\.]{0,15}$/
也允许浮动值。
答案 10 :(得分:0)
您可以使用此代码进行数字验证:
if (!preg_match("/^[0-9]+$/i", $phone)) {
$errorMSG = 'Invalid Number!';
$error = 1;
}