Php 验证数值,但不包括十六进制或sci符号

Php 验证数值,但不包括十六进制或sci符号,php,regex,validation,hex,preg-match,Php,Regex,Validation,Hex,Preg Match,我过去常常依靠is\u numeric()来确保从用户传递的数据是数字的。我最近发现,用户还可以传递数据0xFF(hexdec=255) 我不允许任何不是整数(也不是十六进制表示)的东西 这是我到目前为止试过的 $i_haxors_u = $_GET['id']; $regex = '/[0-9]*/'; if (!empty($i_haxors_u) && !preg_match($regex, $i_haxors_u)) { echo '<p>Inval

我过去常常依靠
is\u numeric()
来确保从用户传递的数据是数字的。我最近发现,用户还可以传递数据
0xFF
(hexdec=255)

我不允许任何不是整数(也不是十六进制表示)的东西

这是我到目前为止试过的

$i_haxors_u = $_GET['id'];

$regex = '/[0-9]*/';
if (!empty($i_haxors_u) && !preg_match($regex, $i_haxors_u))
 {
   echo '<p>Invalid $i_haxors_u ' . strip_tags($i_haxors_u);
 } else { 
   echo '<p>$i_haxors_u is numeric... maybe.';
 }
印刷品

255 is a number.

255 is a number.

0xFF is a number.

0xFF is not a number.

您需要使用锚点并使用
+
量词来仅允许整数:

$regex = '/^\d+$/';

使用
+
量词也将允许您取出
!空($i\u haxor\u)
条件,因为
\d+
将强制执行一个或多个数字。

您需要使用锚并使用
+
量词仅允许整数:

$regex = '/^\d+$/';

使用
+
量词也将允许您取出
!空($i\u haxor\u)
条件,因为
\d+
将强制执行一个或多个数字。

这只是因为您必须测试所有数字:

$regex = '/^[0-9]+$/';

无需使用+

测试空,因为您必须测试所有数字:

$regex = '/^[0-9]+$/';

无需使用+

测试空,在正则表达式中使用匹配非数字:$regex='/\D/'; 当确认输入中不存在非数字时,假设失败并通过

以下代码在id=7时成功,在id=7.2、7.2x、ffff、0xff、-1时失败

$id = $_GET['id'];

//assuming failure:
$valid = false;

if (!preg_match('/\D/',$id)) { $valid = true; } //fail if containing non-digit


if ($valid) {
echo "$id provided is valid";
}
else {
echo "$id provided is not valid";
}

在正则表达式中使用匹配非数字:$regex='/\D/'; 当确认输入中不存在非数字时,假设失败并通过

以下代码在id=7时成功,在id=7.2、7.2x、ffff、0xff、-1时失败

$id = $_GET['id'];

//assuming failure:
$valid = false;

if (!preg_match('/\D/',$id)) { $valid = true; } //fail if containing non-digit


if ($valid) {
echo "$id provided is valid";
}
else {
echo "$id provided is not valid";
}

我认为这是个好主意。但当我编写代码时,我尽量不测试不应该是解决方案的内容,这样以后更容易记住应该是解决方案的内容;-)+1这是最好的解决方案@Croises,最好是积极匹配您所寻找的
preg_match('/\D/',$id)
,您已经找到了罪魁祸首。@Croises没有假定有效的输入对安全和数据清理任务至关重要。假设成功会让你大开眼界。大小与添加&($id>$minSize)一样简单。通过改变正则表达式可以忽略符号。注释代码以解释每个条件。附加的if语句可以在特殊情况下有效。有关preg_match的有趣说明,请参阅问题更新。我认为这是一个好主意。但当我编写代码时,我尽量不测试不应该是解决方案的内容,这样以后更容易记住应该是解决方案的内容;-)+1这是最好的解决方案@Croises,最好是积极匹配您所寻找的
preg_match('/\D/',$id)
,您已经找到了罪魁祸首。@Croises没有假定有效的输入对安全和数据清理任务至关重要。假设成功会让你大开眼界。大小与添加&($id>$minSize)一样简单。通过改变正则表达式可以忽略符号。注释代码以解释每个条件。附加的if语句可以在特殊情况下有效。有关preg_match的有趣说明,请参阅问题更新。实际上有两个条件。字符串是否为空,是否为有效数字
if(empty($v){'empty'}else{if(!preg_-match(/\D/,$v){'alldigits'}else{'atleast1non-digits'}}
实际上有两个条件。字符串是否为空,是否为有效数字。
if(empty($v){'empty'}else{if(!preg_-match(/\D/,$v){'alldigits'}els}els}else{'atleast1non digits'}