Function文件夹中的一些函数方法示例
各函数使用方法和说明详见:Function文件夹中的README.md介绍。
运行结果:
1、password_hash
不指定盐值加密密码zheshiyigemima123
输出结果:string(60) "$2y$10$OpgXEsJ9Lc6cfyH.oEU.E.GicZTY2bKAOg31wWiDIT6KUkDcnY3zi"
;没有通过第三个参数指定固定的盐值(系统会自己添加随机盐值),所以每刷新下结果都会变化的~~~
2、password_verify
效验密码zheshiyigemima123
和曾经保存过的一个hash串$2y$10$WITh4hNt3PZtWIidd8btEOgQiRhUq15ofxDOZQqIDs3BJD/XnEDAu
输出结果:bool(true)
3、password_get_info
获取hash串$2y$10$WITh4hNt3PZtWIidd8btEOgQiRhUq15ofxDOZQqIDs3BJD/XnEDAu
的信息,输出结果:array(3) {
["algo"]=>
int(1)
["algoName"]=>
string(6) "bcrypt"
["options"]=>
array(1) {
["cost"]=>
int(10)
}
}
4、is_mail_valid
检测字符串JJonline@JJonline.Cn
是否是一个合法的邮箱格式,输出:bool(true)
;检测字符串JJon-l#?ine@JJonline.Cn
是否是一个合法的邮箱格式,输出:bool(false)
Ps1:其实按 RFC822标准JJon-l#?ine@JJonline.Cn
是一个合法的邮箱地址,只不过如此反人类的邮箱地址果断不拽它
Ps2:is_mail_valid
默认采用正则检测,也可以采用filter_var($mail,FILTER_VALIDATE_EMAIL)
方式支持RFC822标准
Ps3:is_mail_valid
检测邮箱格式的标准为:用户名部分构成仅能为数字、字母、下划线、加好、减号(中划线)和点,且开头位置仅能为数字或字母;域名部分按域名规则,支持域名中有减号(或者称之为中划线)
测试支持检测的邮箱格式类型:
is_mail_valid
检测邮箱地址字符串JJonline-Cn@JJonline.Cn
的结果bool(true)
;
is_mail_valid
检测邮箱地址字符串JJonline.Cn@JJonline.Cn
的结果bool(true)
;
is_mail_valid
检测邮箱地址字符串JJonline_Com.Cn@JJonline.Cn
的结果bool(true)
;
is_mail_valid
检测邮箱地址字符串JJonline.Com.Cn@JJonline.Cn
的结果bool(true)
;
is_mail_valid
检测邮箱地址字符串123456@JJonline.Cn
的结果bool(true)
;
is_mail_valid
检测邮箱地址字符串JJonline.Cn@JJonline-Com.Cn
的结果bool(true)
;
So,符合人类认知的几种邮箱格式检测均已支持~倘若需要支持检测邮箱中域名后缀为特定的,比如.com、.cn的还不支持
Ps4:邮箱地址和网站网站域名一样是不区分大小写滴;那么问题来了Url区分大小写吗?答案是:看情况,因为*nux文件系统区分,而window文件系统特么又不区分~;只能说协议部分和域名部分是不区分大小写滴~
5、is_phone_valid
检测存在的天朝手机号15872254727
,输出:bool(true)
;is_phone_valid
检测不存在的天朝手机号170123456
,输出:bool(false)
;天朝手机号11位,开头为13[0-9]、14[0-9]、15[0-9]、18[0-9]、176、177、178新号段以及虚拟运营商的170[059]
6、is_url_valid
检测Urlhttps://www.jjonline.cn:443/UserInfo/index.php?UserId=123456&type=Vip#Node=part1
,输出bool(true)
;该方法仅检测http或https打头的Url,包括端口、get变量和锚点支持
7、is_uid_valid
检测QQ号77808859
,输出:bool(true)
;该方法三个参数,第一个必选参数为需要检测的数字账户id,第二个可选参数指定合法的数字账户最短位数[默认4位],第三个可选参数指定合法的数字账户最长位数[默认11位]。
8、is_password_valid
检测密码字符串mima123456
,输出bool(true)
;该方法检测的密码字符串必须同时包含字母和数字;该方法三个参数,第一个必选参数为需要检测的密码字符串,第二个可选参数指定合法的密码字符串最短长度[默认8位],第三个可选参数指定合法的密码字符串最长长度[默认16位]。
9、is_citizen_id_valid
检测身份证号420521198907031846
是否合乎规范,输出:array(6) {
["id"]=>
string(18) "420521198907031846"
["location"]=>
string(6) "湖北"
["Y"]=>
string(4) "1989"
["m"]=>
string(2) "07"
["d"]=>
string(2) "03"
["sex"]=>
int(0)
}
;该函数兼容15位老身份证号和18位新身份证号(若传入15位合法的身份证号将返回转换过的18位身份证号),符合规范返回有内容的关联数组(boolean判断为true),不符合规范返回false
Ps:我都这么卖力的分享了,请给点面子不要拿此身份证号瞎搞
10、time_ago
时间友好表示法,写此示例时的时间戳1438852440
使用time_ago
,输出:string(21) "10年前 (2015-08-06)"
11、Input
统一方式获取外部变量或用户提交的变量数据;函数原型:Input('变量类型.变量名/修饰符',['默认值'],['过滤方法'],['额外数据源'])
“变量类型”可选为:
变量类型 | 含义解释 |
get | 获取GET变量;此时第四个参数无任何意义 |
post | 获取POST变量;此时第四个参数无任何意义 |
param | 自动判断请求类型获取GET、POST或者PUT变量;此时第四个参数无任何意义 |
request | 获取REQUEST变量;此时第四个参数无任何意义 |
put | 获取PUT变量;此时第四个参数无任何意义 |
session | 获取$_SESSION变量;建议使用session函数;此时第四个参数无任何意义 |
cookie | 获取$_COOKIE变量;建议使用cookie函数;此时第四个参数无任何意义 |
server | 获取$_SERVER变量;此时第四个参数无任何意义 |
globals | 获取$GLOBALS变量;此时第四个参数无任何意义 |
data | 获取其他类型的变量,需要第四个参数['额外数据源']配合 |
“修饰符”可选为:s、d、b、a、f
;表示获取的数据被强制转换的类型,s=>string[字符串]、d=>double[整形]、b=>boolean[布尔值]、a=>array[数组]、f=>float[浮点数];未设置该参数默认为s
“默认值”表示需要获取的指定变量不存在时返回这个默认值,注意变量不存在的含义
;假设获取get变量action,也就是说$_GET['action']
不存在才会返回默认值;这里存在这种情况:($_GET['action']==='')为true
;这就需要对“变量是否存在”的深入理解,直接给答案不解释,这种情况Input返回空字符串并不会返回设置的默认值。
“过滤方法”参数,可以是数据处理或过滤的函数名字符串(自定义函数亦可,留意过滤函数方法体的合理性),多个函数使用逗号分隔函数名成字符串或用索引数组;也可以是一个正则表达式,使用正则来过滤数据(此时表达式分隔符必须是左划线[正划线];使用正则倘若匹配失败则不会返回原值,而是会返回设置的默认值或者null);同时也可以是int型常量或变量用于filter_var的第二个参数,并使用filter_var进行过滤。若传递的函数并不存在,此时将尝试将该参数理解成filter_var过滤方法的第二个参数(int型)并用filter_var函数对数据过滤。
“额外数据源”可以使用Input处理该函数第一个参数中的“变量类型”所不支持的数据类型(主要指那些超全局变量);Input函数仅用于获取(并不进行数据设置),使用“额外数据源”参数则需要“变量类型”必须设置为data,继而“默认值”参数、“过滤方法”参数相互配合,用更少的代码完成更多的事情。该参数类型可以是数组也可以是字符串。
注意:Input默认Sql注入的安全过滤需要针对特定业务场景,有需要进一步过滤请完善./Function/UsefullFunction.php中的Input_filter函数
;该函数默认过滤掉纯粹的特定Sql语句中的关键词,若数据中包含这些Sql关键词是不会被过滤的!
Input是一个很强大的函数,用法举例:
- 获取所有get变量
Input('get.')
或Input('get.','','trim,strip_tags')
;第一种写法相当于获取$_GET,第二种写法则对$_GET进行了过滤,并设置了默认值(当且仅当$_GET不存在时才会返回默认值;这里某种意义上来看设置默认值并没有什么意义,因为超全局数组在不手动unset的情况下isset均为true)
- 获取get变量名为action的值并过滤:
Input('get.actoin','不存在get变量action','trim,strip_tags')
,输出结果:string(24) "不存在get变量action"
,你也可以在本url上加上?action= 这是action变量<p>值</p>
(注意html标签p和首尾空格会被过滤掉);这样返回的结果应该为:这是action变量值
。(也就是传统方法中的$_GET['actoin']
;只不过使用Input方法功能更强大,可以统一指定过滤方法也可以指定当action不存在时返回的默认值;节省很多业务逻辑代码)
- 获取session值,
Input('session.uid',false)
若存在$_SESSION['uid']
则返回$_SESSION['uid']
,否则返回false
;需要留意的是$_SESSION可能是多维(二维及其以上)数组,Input仅能获取到第一维中的数据(即一个数组),暂时并不能通过Input('session.uid.name',false)
来获取$_SESSION['uid']['name']
;此功能以后可能会支持。
- 获取cookie值,
Input('cookie.uid',false)
若存在$_COOKIE['uid']
则返回$_COOKIE['uid']
,否则返回false
;当然你也可以指定过滤方法。
- 自动判断请求类型并获取指定变量名的值,
Input('request.id')
或Input('id')
;如果当前请求类型是GET,那么等效于$_GET['id']
,如果当前请求类型是POST或者PUT,那么相当于获取$_POST['id']
或者PUT提交的数据中的id项数据。
Input('server.REQUEST_METHOD')
获取$_SERVER['REQUEST_METHOD']
- 获取外部数据,
Input('data.file1','','',$_FILES)
12、session
函数用于统一设置、获取session
13、cookie
函数用于统一设置、获取cookie;函数原型cookie('COOKIE名',['COOKIE值'],['COOKIE配置项'])
;注意此函数有默认配置项,可以按需定制(修改函数体开始的$config数组即可),亦可通过'COOKIE配置项'参数覆盖默认配置。
'COOKIE名':用于获取或设置指定名称的COOKIE,若'COOKIE名'传入null
则表示删除指定前缀的所有cookie,此时若cookie名前缀为空将不做任何处理即不删除任何cookie;作为php标准,当并未按需指定默认配置时可以通过'COOKIE配置项'参数传入cookie前缀,写法为:cookie(null,null,array('prefix'=>'J_'))
;函数体也做了变通处理还可以这么写cookie(null,'J_')
,此时第二个参数将被理解成要删除的cookie前缀。
'COOKIE值':用于设置cookie的值,或当'COOKIE名'为null
并且'COOKIE值'不为null
,此时'COOKIE值'表示传入cookie前缀,以用于快速删除该cookie前缀的所有cookie。
'COOKIE配置项'参数形式:
'COOKIE配置项'允许三种类型变量参数:int、string(int)以及array,可以理解为两种,多数情况下允许传入数组;仅进行cooke设置时'COOKIE配置项'参数方可允许为数值型参数(无论是int还是int型的字符串);此时的数值表示为该设置的cookie设置一个过期时间,例如cookie('J_cookie','required',3600)
,表示设置一个名为J_cookie
,值为required
,过期时间为3600秒
的cookie。当'COOKIE配置项'为数组时,该关联数组的结构为:array('prefix'=>string,'expire'=>int,'path'=>path string,domain'=>string,'httponly'=>boolean)
,其中索引不区分大小写,prefix为设置该cookie的前缀(设置前缀也可以通过默认值配置或者直接将'COOKIE名'设置为完整的cookie名称)、设置的cookie过期时间(默认浏览器关闭cookie失效)、以及cookie的作用目录(默认/)、作用域名(默认当前域名)、以及该cookie是否httponly;除prefix外,其余几个索引键与setcookie(string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]])
函数对应;仅需留意的是expire索引键的值通过cookie函数仅需指定多少秒后过期即可,而无需再加上time()
,比如使用setcookie函数设置一个1个小时后过期的cookie,expire参数为time()+3600
,而使用cookie函数,expire仅需要传入3600
即可。
cookie是一个很强大的函数,用法举例:
- 设置一个有前缀prefix的cookie,假设该prefix为
J_
,有多种方法:第一种cookie('user','jjonline@jjonline.cn',array('prefix'=>'J_',expire=>3600,'domain'=>'.jjonline.cn','httponly'=>true))
第二种cookie('J_user','jjonline@jjonline.cn',array(expire=>3600,'domain'=>'.jjonline.cn','httponly'=>true))
,或者直接在cookie函数体中将$config
中的prefix
项写死为'J_'
- 读取上一步设置的cookie,也有多种写法:
cookie('J_user')
或者cookie('user','',array('prefix'=>'J_'))
以及cookie('J.user')
;倘若在cookie函数体中将$config中的prefix项写死为'J_',还可以这样cookie('user')
- 删除上一步设置的cookie,
cookie('J_user',null)
或者cookie('J.user',null)
- 为cookie值设置一个数组,
cookie('J_info',array('id'=>1,'vip'=>1))
,cookie内部自动将数组使用json_encode编码成字符串并在字符串开头位置加上Array:
,采用cookie函数读取该cookiecookie('J_info')
将返回数组。
不再详细介绍的函数:format_bytes
1、Hashids类:加密数字型id成字符串hash并可反向解密hash成数字id
应用场景:url中不便于直接显示成数字的id加密成唯一性的字符串(hash);php脚本接收到该hash后又可以很方便的还原成数字id。也可以将多个数字型的参数一次性加密后作为一个GET变量附加在url中。
<?php
#三个可选参数,
#参数1为加密盐值
#参数2为指定加密后的hash串最小长度
#参数3为手动指定hash串中允许出现的字符
$obj = new Library\Hashids\Hashids('http://blog.jjonline.cn',16);
#加密数字1成为字符串 此处可以传递多个数字一起加密 或者一个value全部为数字的索引数组
var_dump($obj->encode(1));# 可能的字符串输出:1nZVNL5Eq5793Jyg
#解密hash字符串为数字原型
$restult = $obj->decode('1nZVNL5Eq5793Jyg');
#注意解密后成为数组
var_dump($restult);
#加密多个数字型索引数组
var_dump($obj->encode(1,2,3));#可能的字符串输出:K8aO5d4Uos45b2dr
#或者写法为var_dump($obj->encode([1,2,3]));
#此类还提供加密16进制数的方法 不再介绍 原理一致 只不过方法名变化:encode_hex和decode_hex
?>
运行结果:
数字1
加密后的hash字符串为:string(16) "1nZVNL5Eq5793Jyg"
hash串1nZVNL5Eq5793Jyg
解密后的数字原型为:int(1)
数组[1,2,3]
加密后的hash字符串为:string(16) "K8aO5d4Uos45b2dr"
数组型hash串K8aO5d4Uos45b2dr
解密后的数字原型数组为:array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
2、PasswordHash类:不可逆的密码加密和密码对比,开源原始名:phpass
应用场景:加密密码字符串成为不可逆的hash字符串,此加密方式一个明文密码对应无数个hash串;通过保存的hash串和密码明文进行对比,又可以效验明文密码的正确性。[该加密类被WordPress、emlog等许多开源程序使用]
<?php
#两个参数,第一个参数指定加密深度 int 取值范围5-30 第二个参数指定该加密是否可以移植指定false,更换运行环境后解密将出现问题
$PasswordHash = new Library\PasswordHash\PasswordHash(8,true);
#加密密码 zheshiyigemima123 可以发现每一次刷新结果都不一样 保留一个结果:$P$BPae94jMsALnSwBm5fnKiMBpLuxZfN1 用于下方密码效验试验
var_dump($PasswordHash->HashPassword('zheshiyigemima123'));
#对比数据库保存的密码hash串:$P$BPae94jMsALnSwBm5fnKiMBpLuxZfN1是否为明文密码:zheshiyigemima123的一个hash;换种方式描述:核对用户密码是否正确
#第一个参数为需要核对的明文密码 第二个参数为曾经加密获得并保存的hash串
#该方法返回boolean值 true效验成功 false的话.....说多了都显得愚蠢了
var_dump($PasswordHash->CheckPassword('zheshiyigemima123','$P$BPae94jMsALnSwBm5fnKiMBpLuxZfN1'));
#继续试验 将密码明文换下 zheshiyigemima321
var_dump($PasswordHash->CheckPassword('zheshiyigemima321','$P$BPae94jMsALnSwBm5fnKiMBpLuxZfN1'));
?>
运行结果:
密码zheshiyigemima123
加密后的hash字符串为:string(34) "$P$BI2vMjCoWlvvIMdCeSZcvBQkRS9cVW1"
;每刷新下结果都会变化的~~~
用曾经保存过的一个hash串$P$BPae94jMsALnSwBm5fnKiMBpLuxZfN1
来核对密码zheshiyigemima123
(正确的密码)是否正确:bool(true)
用曾经保存过的一个hash串$P$BPae94jMsALnSwBm5fnKiMBpLuxZfN1
来核对密码zheshiyigemima321
(错误的密码)是否正确:bool(false)