我不知道如何处理这个,我已经尝试过对我来说最明显的解决方案,但到目前为止还没有一个证明完全令人满意。我必须忽视一些非常简单的事情。
我有一个输入类型为text的表单:
<input type="text" name="album_id">
我想验证输入,因此用户只输入无符号整数...
$required = array(); // required or invalid input
$tmp = trim($_POST['album_id']);
if (!is_int((int)$tmp)) {
$required['album'] = 'The album id must contain a positive numeric value only.';
}
到目前为止,我已经使用!is_numeric($tmp)
,但是用户可以输入9.2或“1e4”,它将验证...以便一个不起作用。
我也试过!is_int((int)$tmp)
但是由于某种原因,那个不起作用(也许它应该但我做错了......)。
我试过ctype_digit
没有成功。
我可能忽略了一些但不确定是什么。
如何在php中验证无符号数?没有浮点数,负数等......只是一个简单的无符号数(1到n)。
答案 0 :(得分:7)
如果你想检查一些变量是否只包含数字(这似乎是你想要的,在这里),你可能必须使用ctype_digit()
。
不确定你尝试了什么,但这样的事情应该有效:
$tmp = trim($_POST['album_id']);
if (ctype_digit($tmp)) {
// $tmp only contains digits
}
答案 1 :(得分:4)
filter_var()
功能是这里工作的正确工具。
这是一个只对无符号整数或无符号整数字符串返回非假的过滤器:
$filteredVal = filter_var($inputVal,
FILTER_VALIDATE_INT,
array('options' => array('min_range' => 0)));
示例:
<?php
$testInput = array(
"zero string" => "0",
"zero" => 0,
"int" => 111,
"string decimal" => "222",
"empty string" => "",
"false" => false,
"negative int" => -333,
"negative string decimal" => "-444",
"string octal" => "0555",
"string hex" => "0x666",
"float" => 0.777,
"string float" => "0.888",
"string" => "nine"
);
foreach ($testInput as $case => $inputVal)
{
$filteredVal = filter_var($inputVal,
FILTER_VALIDATE_INT,
array('options' => array('min_range' => 0)));
if (false === $filteredVal)
{
print "$case (". var_export($inputVal, true) . ") fails\n";
}
else
{
print "$case (". var_export($filteredVal, true) . ") passes\n";
}
}
输出:
zero string (0) passes
zero (0) passes
int (111) passes
string decimal (222) passes
empty string ('') fails
false (false) fails
negative int (-333) fails
negative string decimal ('-444') fails
string octal ('0555') fails
string hex ('0x666') fails
float (0.777) fails
string float ('0.888') fails
string ('nine') fails
答案 2 :(得分:1)
您可以使用preg_match()
:
if(preg_match('/^[\\d+]$/', $tmp) == 0)
$required['album'] = 'The album id must ...';
请注意,这不会进行正范围检查(例如,超过整数的最大有效值)。
编辑: 使用Pascal MARTIN的解决方案,除非您想要进行更复杂的检查(例如需要其他特殊字符),因为我猜它可以提供更好的性能。
答案 3 :(得分:1)
if (preg_match('!^[1-9][0-9]*$!',$tmp)) {