一、正则表达式实例
(1)非空
非空转换成正则表达式的口头语言就是 原子出现的次数为一次到无穷大次(无论是可见原子还是不可见原子),那么它的正则表达式就应该这么写 $pattern = ‘/.+/’
(.表示匹配除换行符以外的所有字符,+表示一个量词,它表示前边的原子连续出现一次到无穷大次),当然这种写法不是唯一,大家也可以自己想出一些,然后使用我上一篇博客中提到的工具测试一下(http://blog.youkuaiyun.com/self_realian/article/details/78568368)
(2)浮点数匹配(以保留两位的浮点数为例)
转换成口头语言就是:首先肯定是一个数字,这个数字可能3位,也可能n位,也就是数字连续出现1次到无穷次,后边跟一个小数点,最后再跟上两个数字 $pattern=’/\d+\.\d{2}$/’
; 这个表达式很简单就不解释了,看完上一篇博客,这个很好理解的(强调一下后边那个$符,就是强制要求小数点后边必须两位)(http://blog.youkuaiyun.com/self_realian/article/details/78568368)
(3)手机号匹配
转换成口头语言就是:首先是一个十一位的数字,然后第一位是1,第二位一般也就是3,4,5,7,8
$pattern = ‘/1(3|4|5|7|8)\d{9}/’;
(4)Email地址匹配
转换成口头语言就是:首先在@符的前边可能是字母、数字、下划线,而出现的次数可能是一次到无穷大次
$pattern = ‘/^\w+(\.\w+)*@\w+(\.\w+)+$/’;
需要解释的地方就是(.\w+)* 部分,因为有的邮箱可能在@符的前边也有.,而且可能不止一个,所以写了这部分表达式
(5)URL地址匹配
这个我直接就写了,大家看我的截图就行
$pattern = ‘/^(https?:\/\/)?(\w\.)+[a-zA-Z]+$/’
总结:正则表达式有很大的灵活性,这些写法都不是唯一的,大家可以尝试着用别的方法去写
二、正则工具类
regexTool.class.php
<?php
class regexTool {
private $validate = array(
'notnull' => '/^.+$/',
'float' => '/^\d+\.\d{2}$/',
'phonenumber' => '/^1(3|4|5|7|8)\d{9}$/',
'email' => '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/',
'url' => '/^(https?:\/\/)?(\w\.)+[a-zA-Z]+$/',
'qq' => '/^\d{5,11}$/',
);//这个私有成员存放一些常用的正则表达式
private $returnMatchResult = false;//定义它返回的结果,到底是匹配到的次数还是匹配结果
//当这个成员属性为false时,我们只返回验证的结果为真还是假,如果为true,则返回的是匹配到的结果的数组
private $fixMode = null;//这个用来存放修正模式(贪婪模式、懒惰模式)
private $matches = array();//匹配到的结果数组
private $isMatch = false;//验证的结果(验证成功返回true,失败返回false)
public function __construct($returnMatchResult = false, $fixMode = null){//第一个参数,定义返回结果的类型,第二个参数为修正模式
$this->returnMatchResult = $returnMatchResult;
$this->fixMode = $fixMode;
}
//定义一个私有的核心匹配方法
private function regex($pattern, $subject){//$pattern 正则表达式 $subject匹配的目标数据
//当这个$pattern在我们类中定义的那些常用的正则表达式时,我们就不用再重新写正则表达式了,直接去获取。如果没有,我们就可以通过自定义的方式来书写
if(array_key_exists(strtolower($pattern), $this->validate)){//查看数组中是否存在某一个键
$pattern = $this->validate[$pattern].$this->fixMode;
}
//判断我们是要匹配到的结果数组,还是是否匹配到
$this->returnMatchResult ? preg_match_all($pattern, $subject, $this->matches) :
$this->isMatch = preg_match($pattern, $subject) === 1;
return $this->getRegexResult();//因为这个返回值的类型我们不确定,所以我们单独写了一个函数
}
private function getRegexResult(){
if($this->returnMatchResult){
return $this->matches;//如果为真,返回的是匹配结果的数组
}else{
return $this->isMatch;
}
}
//当对象实例化完成之后,可能中途中我们会有切换返回类型的需求,比如说,一开始我们想返回匹配的结果,那么经过一些逻辑操作之后,我们可能想让它返回一个验证的结果,那么就需要写一个方法,让它可以切换返回的类型
public function toggleReturnType($bool = null){
if(empty($bool)){
$this->returnMatchResult = !$this->returnMatchResult;
}else{
$this->returnMatchResult = is_bool($bool) ? $bool : (bool)$bool;
}
}
//下边定义一些修改私有成员属性的一些方法
//修改修正模式
public function setFixMode($fixMode){
$this->fixMode = $fixMode;
}
//定义一些在函数外部,调用的数据验证的方法
//1,非空验证
public function noEmpty($str){
return $this->regex('notnull',$str);//验证非空的正则表达式在我们定义的常用正则表达式中有,所以我们直接传入key值
}
//2,验证Email是否正确的方法
public function isEmail($email){
return $this->regex('email',$email);
}
//3,手机号的验证
public function isMobile($mobile){
return $this->regex('phonenumber',$mobile);
}
//别的验证就不一一写了
//用户自定义的正则表达式的验证
public function check($pattern, $subject){
return $this->regex($pattern, $subject);
}
}
test.php
require_once 'regexTool.class.php';
$regex = new regexTool();
$e = $regex->setFixMode('U');
//验证邮箱
$result = $regex->isMobile('13213795555');
show($result);
function show($var = null, $isdump = false) {
$func = $isdump ? 'var_dump' : 'print_r';
if(empty($var)) {
echo 'null';
} elseif(is_array($var) || is_object($var)) {
//array,object
echo '<pre>';
$func($var);
echo '</pre>';
} else {
//string,int,float...
$func($var);
}
}
邮箱验证:
手机号验证: