php用正则判断是否为数字的方法


Posted in PHP onMarch 25, 2016

前两天朋友的一个网站上有人利用php注入提交flash游戏分数,后来找原因才发现是有一位参数没有做数字判断导致。

本来保存游戏分数是 game.php?ac=save&fgid=1这个形式来实现,在php网页里面fgid直接调用,没有做任何的过滤。很多人利用在fgid=1后面加一个字母(fgid=1a),来实现一些非法操作。

假如  gamlist table 里面有一个游戏  fgid为102
select gname from gamelist where fgid='102′;
select gname from gamelist where fgid='102a';
这样都可以成功的找到游戏名字gname,这就给很多人提供了可乘之机

建议大家对关键的参数必须做过滤。如数字正则过滤

<?php
$fgid="123";
if(preg_match("/^\d*$/",$fgid))  echo('是数字');
else  echo('不是数字');

或者用函数

if(is_numeric($fgid)) echo('是数字');
else echo('不是数字');

网上用来判断id是否为数字的方法

$cid = empty($cid)? 1 : intval(preg_replace("/[^-\d]+[^\d]/",'', $cid));

这两种方法的区别是  is_numeric小数也会认为是数字,而前面正则会把小数点当作字符。

附一些常用的正则运算:

验证数字:^[0-9]*$
验证n位的数字:^\d{n}$
验证至少n位数字:^\d{n,}$
验证m-n位的数字:^\d{m,n}$
验证零和非零开头的数字:^(0|[1-9][0-9]*)$
验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
验证非零的正整数:^\+?[1-9][0-9]*$
验证非零的负整数:^\-[1-9][0-9]*$
验证非负整数(正整数 + 0)  ^\d+$
验证非正整数(负整数 + 0)  ^((-\d+)|(0+))$
验证长度为3的字符:^.{3}$
验证由26个英文字母组成的字符串:^[A-Za-z]+$
验证由26个大写英文字母组成的字符串:^[A-Z]+$
验证由26个小写英文字母组成的字符串:^[a-z]+$
验证由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
验证由数字、26个英文字母或者下划线组成的字符串:^\w+$
验证用户密码:^[a-zA-Z]\w{5,17}$ 正确格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线。
验证是否含有 ^%&‘,;=?$\” 等字符:[^%&‘,;=?$\x22]+
验证汉字:^[\u4e00-\u9fa5],{0,}$
验证Email地址:^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
验证InternetURL:^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ ;^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$
验证电话号码:^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$:?正确格式为:XXXX-XXXXXXX,XXXX-XXXXXXXX,XXX-XXXXXXX,XXX-XXXXXXXX,XXXXXXX,XXXXXXXX。
验证身份证号(15位或18位数字):^\d{15}|\d{}18$
验证一年的12个月:^(0?[1-9]|1[0-2])$ 正确格式为:“01”-“09”和“1”“12”
验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$    正确格式为:01、09和1、31。
整数:^-?\d+$
非负浮点数(正浮点数 + 0):^\d+(\.\d+)?$
正浮点数   ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
非正浮点数(负浮点数 + 0) ^((-\d+(\.\d+)?)|(0+(\.0+)?))$
负浮点数  ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
浮点数  ^(-?\d+)(\.\d+)?

补充一下:

bool is_numeric ( mixed $var )
如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE。

For example 1:

<?php
  $v = is_numeric ('58635272821786587286382824657568871098287278276543219876543') ? true : false;
  
  var_dump ($v);
?>

The above script will output:

bool(true)

For example 2:

<?php
$str="0";
$strTest=is_numeric(0);
var_dump($strTest);
?>

boolean true 

is_bool();//判断是否为布尔型
is_float(); //判断是否为浮点型
is_int(); //判断是否为整型
is_numeric(); //判断是否为数值型
is_string(); //判断是否为字符串
is_array(); //判断是否为数组
is_object(); //判断是否为对象

function int_str($str){
  if(is_numeric($str)){
    $str = 'm'.$str;
  }
  return $str;
}

我们用intval来判断用户输入的信息是否为数字,这个可以自动转换成数字,如果是0,返回的值也是假的,在php判断用户输入的是否为数字型或是否为数字型字符串,我们会用到is_numeric与intval函数来处理.实例代码如下:

$num = 1; 
$num1 ='1'; 
$str ='abc'; 
if( is_numeric( $num ) ) 
{ 
  echo $num.'是数字型'; 
} 
//1是数字型 
if( is_numeric( $num1) ) 
{ 
  echo $num1.'是数字型'; 
} 
else
{ 
  echo $num1.'不是数字型'; 
}

//1是数字型

第二个实例为看还是数字型呢,这要看php是那类型的语言了,关键是php是弱语言型,所以就会自动把数字型字符转换成数字了,实例代码如下:

if( intval( $str ) ) 
{ 
  echo $str.'是数字'; 
} 
else
{ 
  echo $str.'不是数字'; 
} 
//acd不是数字 
if( intval( $num1 ) ) 
{ 
  echo $num1.'是数字'; 
} 
else
{ 
  echo $num1.'不是数字'; 
} 
//1是数字

这篇文章就介绍到这了,需要的朋友可以参考一下。

PHP 相关文章推荐
Zend公司全球首推PHP认证
Oct 09 PHP
PHP加密扩展库Mcrypt安装和实例
Nov 10 PHP
PHP curl 抓取AJAX异步内容示例
Sep 09 PHP
PHP使用缓存即时输出内容(output buffering)的方法
Aug 03 PHP
php实现表单多按钮提交action的处理方法
Oct 24 PHP
PHP匿名函数和use子句用法实例
Mar 16 PHP
使用php实现从身份证中提取生日
May 09 PHP
PHP如何实现订单的延时处理详解
Dec 30 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
Apr 10 PHP
PHP安全之register_globals的on和off的区别
Jul 23 PHP
PHP实现简单日历类编写
Aug 28 PHP
php使用event扩展的io复用测试的示例
Oct 20 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
Mar 25 #PHP
PHP程序员的技术成长规划
Mar 25 #PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
Mar 25 #PHP
PHP 生成微信红包代码简单
Mar 25 #PHP
PHP实现动态执行代码的方法
Mar 25 #PHP
PHP动态生成指定大小随机图片的方法
Mar 25 #PHP
PHP5.2中PDO的简单使用方法
Mar 25 #PHP
You might like
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
PHP中is_file()函数使用指南
2015/05/08 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
2016/12/14 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
php数组和链表的区别总结
2019/09/20 PHP
laravel validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
js的各种数据类型判断的介绍
2019/01/19 Javascript
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
使用PyInstaller将Python程序文件转换为可执行程序文件
2016/07/08 Python
python 实现在一张图中绘制一个小的子图方法
2019/07/07 Python
pygame实现飞机大战
2020/03/11 Python
Keras 切换后端方式(Theano和TensorFlow)
2020/06/19 Python
pytorch SENet实现案例
2020/06/24 Python
python如何利用Mitmproxy抓包
2020/10/10 Python
canvas进阶之如何画出平滑的曲线
2018/10/15 HTML / CSS
html5给汉字加拼音加进度条的实现代码
2020/04/07 HTML / CSS
linux面试题参考答案(8)
2016/04/19 面试题
合同专员岗位职责
2013/12/18 职场文书
关于圣诞节的广播稿
2014/01/26 职场文书
秋季运动会活动方案
2014/02/05 职场文书
大学生军训感想
2014/02/16 职场文书
租房协议书怎么写
2014/04/10 职场文书
乡镇2014法制宣传日活动总结
2014/11/01 职场文书
2015欢度元旦标语口号
2014/12/09 职场文书
关于运动会的广播稿
2015/08/19 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
MySQL Innodb索引机制详细介绍
2021/11/23 MySQL