一、内容要点
     正则的概念
     PHP中常用正则相关函数
     正则表达式语法
     正则表达式工具类
二、概念
     外表风骚,内功深厚
     正则表达式是一种字符串搜索和匹配的工具。

三、PHP中常用的正则表达式函数
     preg_match($pattern,$subject);//表单验证
     preg_match_all($pattern,$subject,array &matches);
     preg_replace($pattern,$replacement,$subject);//过滤非法词语
     preg_filter($pattern,$replacement,$subject);
     preg_grep($pattern,$subject);
     preg_split($pattern,$subject);
     preg_quote($str);

$pattern:正则表达式
     $subject:匹配的目标数据

3.1 preg_math()与preg_match_all()
     preg_match($pattern,$subject,[array &$matchs]);只匹配一次
     preg_match_all($pattern,$subject,array &$matchs);完全匹配
     两则都会将匹配结果放入$matchs数组中

返回值return  匹配到结果的次数

 $pattern = '/[0-9]/';$subject = 'sdfa32dsfa23435ssdfdf';$m1 = $m2 = array();$r1 = preg_match($pattern,$subject,$m1);$r2 = preg_match_all($pattern,$subject,$m2);print_r($r1.'--'.$m1);echo '<h1/>'print_r($r2.'--'.$m2);

3.2 preg_replace()与preg_filter()
     preg_replace($pattern,$replacement,$subject);
     preg_filter($pattern,$replacement,$subject);

功能一致,只是返回值不一样
     preg_replace会保留没有匹配的字符串
     preg_filter不回保留没有匹配的字符串

$pattern = ['/[01234]/','/[567]/','/[89]/'];$subject = ['sfsf','3af4','s','ff556'];$replacement = ['PHP','最',‘牛逼’];$r1 = preg_replace($pattern,$replacement,$subject);$r2 = preg_filter($pattern,$replacement,$subject);print_r($r1);echo '<hr/>';print_r($r2);

3.3 preg_grep()
      preg_grep($pattern,$subject);

阉割版的preg_filter
      该函数不做替换,只做匹配
      返回值是匹配到的字符串

$pattern = '/[0-9]/';$subject = ['sfsf','3af4','s','ff556'];$arr = preg_grep($pattern,$subject);print_r($arr);

3.4 preg_split
      preg_split($pattern,$subject);

利用$pattern 匹配到的字符串作为分隔符 将$subject分割成数组并返回
      可以看作是explode的高级版

$pattern = '/[0-9]/';$subject = 'php5是2世界上4最好2的3语言';$arr = preg_split($pattern,$subject);print_r($arr);

3.5 preg_quote
      preg_quote($str);

将$str中的正则表达式转义
     如.\+*?[^]$(){}=!<>|:-等等都会加上反斜杠

$str = 'php\w+世界上[1234]{2}';$str = preg_quote($str);print_r($str);

四、正则表达式语法

-  界定符
-  原子
-  量词
-  边界控制
-  模式单元

4.1 界定符
     表示一个正则表达式的开始和结束
     /正则表达式/
     #正则表达 式 #
     {正则表达}

为了不引起歧义不建议使用大括号,建议使用斜杠或者#

4.2 正则表达式工具
     regexpal
     在线版:http://regexpal.isbadguy.com/

4.3 原子性
     原子是正则表达式中最小的匹配单位
     包括可见原子和不可见原子

可见原子--unicode编码表中用键盘输出后肉眼可见的字符
     包括:
          -标点;"_?.等等
          -英文字母数字 a-z,A-Z,0-9
          -汉子、日文、阿拉伯文等其他语言文字
          -数理化公式符号
          -其他可见字符

不可见原子--unicode编码表中用键盘输出后肉眼不可见的字符
     包括:
          -换行符 \n
          -回车 \r
          -制表符 \t
          -空格
          -其他不可见字符
          注意:涉及到中文的匹配一定要将中文转换成unicode编码再写入正则表达式中去
               如何转换?找在线转换工具
              如果匹配的符号是正则的运算符,那么需要加上转义符 \

4.4 元字符
     ①定义原子的筛选方式
          | 匹配两个或多个分支选择
          []  匹配方括号中的任意一个原子
          [^] 匹配除方括号中的原子之外的任意字符
     ②定义原子的集合
          . 匹配除换行符之外的任意字符
          \d 匹配任意一个十进制数字 即[0-9]
          \D 匹配任意一个非十进制数字 即 [^0-9]
          \s 匹配一个不看见原子 即 [\f\n\r\t\v]
          \S 匹配一个可见原子 即 [^\f\n\r\t\v]
          \w 匹配任意一个数字字母下划线 即 [0-9a-zA-Z_]
          \W 匹配任意一个非数字字母下划线 即 [^0-9a-zA-Z_]

4.5 量词
     {n} 原子恰好出现n次
     {n,} 原子最少出现n次
     {n,m} 原子最少出现n次,最多出现m次
      * 匹配0次或者多次 即{0,}
     + 匹配一次或者多次 即{1,}
     ? 匹配0次或者1次 即 {0,1}

4.6 边界控制与模式单元
     ^ 匹配字符串开始位置
     $ 匹配字符串结尾位置
     () 匹配其中的整体为一个原子

4.7 修正模式
        贪梦模式
          匹配结果存在歧义时取其长
        懒惰模式
          匹配结果存在歧义时取其短

//$pattern = '/php.+123/';//默认是贪梦模式$pattern = '/php.+123/U';//加上U则是懒惰模式$subject = 'php___123123123123';$matchs = [];preg_match($pattern,$subject,$matchs);print_r($arr);

常见修正模式:
          U/u--懒惰匹配/贪梦匹配
          i  --忽略引文字母大小写
          x --忽略空白
          s --让元字符' . '匹配包括换行符在内的所有字符
          e --

五、常见正则的书写
     非空: /.+/
     2位浮点数: /\d+\.\d{2}$/
     手机号:/^1[34578]\d{9}$/
     email: /^\w+(\.\w+)*@\w+(\.\w+)+$/

六、正则工具类

<?phpclass regexTool {
//自带的一些正则表达式
private $validate = array(
'require' => '/.+/',
'email' => '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/',
'url' => '/^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(?:[\/\?#][\/=\?%\-&~`@[\]\':+!\.#\w]*)?$/',
'currency' => '/^\d+(\.\d+)?$/',//货币
'number' => '/^\d+$/',
'zip' => '/^\d{6}$/',
'integer' => '/^[-\+]?\d+$/',
'double' => '/^[-\+]?\d+(\.\d+)?$/',
'english' => '/^[A-Za-z]+$/',
'qq' => '/^\d{5,11}$/',
'mobile' => '/^1(3|4|5|7|8)\d{9}$/',
);
private $returnMatchResult = false;//是否返回结果
private $fixMode = null;//修正模式
private $matches = array();//匹配的结果数组
private $isMatch = false;//是否匹配/**
* [__construct 构造方法]
* @Author Teacher黄
* @DateTime 2017-09-09T22:58:36+0800
* @param boolean $returnMatchResult [是否返回结果]
* @param [type] $fixMode [修正模式]
*/
public function __construct($returnMatchResult = false, $fixMode = null) {
$this->returnMatchResult = $returnMatchResult;
$this->fixMode = $fixMode;
}
/**
* [regex 执行正则匹配的方法]
* @Author Teacher黄
* @DateTime 2017-09-09T22:59:22+0800
* @param [type] $pattern [正则表达式|关键字]
* @param [type] $subject [需要验证的字符串]
* @return [type] [根据相应的配置返回结果]
*/
private function regex($pattern, $subject) {
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();
}/**
* [getRegexResult 得到匹配结果的方法]
* @Author Teacher黄
* @DateTime 2017-09-09T23:00:39+0800
* @return [type] [根据相应的配置返回结果]
*/
private function getRegexResult() {
if($this->returnMatchResult) {return $this->matches;
} else {return $this->isMatch;
}
}
/**
* [toggleReturnType 切换返回结果的类型]
* @Author Teacher黄
* @DateTime 2017-09-09T23:01:14+0800
* @param [type] $bool [切换标记]
* @return [type] [description]
*/
public function toggleReturnType($bool = null) {
if(empty($bool)) {$this->returnMatchResult = !$this->returnMatchResult;
} else {$this->returnMatchResult = is_bool($bool) ? $bool : (bool)$bool;
}
}/**
* [setFixMode 设置修正模式]
* @Author Teacher黄
* @DateTime 2017-09-09T23:02:25+0800
* @param [type] $fixMode [修正模式的值]
*/
public function setFixMode($fixMode) {$this->fixMode = $fixMode;
}/**
* [noEmpty 是否位空]
* @Author Teacher黄
* @DateTime 2017-09-09T23:02:46+0800
* @param [type] $str [需要检测的字符串]
* @return [type] [description]
*/
public function noEmpty($str) {return $this->regex('require', $str);
}/**
* [isEmail 是否时邮箱]
* @Author Teacher黄
* @DateTime 2017-09-09T23:03:29+0800
* @param [type] $email [邮箱字符串]
* @return boolean [description]
*/
public function isEmail($email) {return $this->regex('email', $email);
}
/**
* [isMobile 是否是手机号]
* @Author Teacher黄
* @DateTime 2017-09-09T23:04:02+0800
* @param [type] $mobile [description]
* @return boolean [description]
*/
public function isMobile($mobile) {return $this->regex('mobile', $mobile);
}/**
* [check 检测的方法]
* @Author Teacher黄
* @DateTime 2017-09-09T23:04:17+0800
* @param [type] $pattern [正则表达式 | 关键字]
* @param [type] $subject [需检测的字符串]
* @return [type] [description]
*/
public function check($pattern, $subject) {return $this->regex($pattern, $subject);
}}

PHP与正则表达式 | 黄乔国PHP相关推荐

  1. MySQL常用函数整理 | 黄乔国PHP

    MySQL数据库中有很多实用的内置函数,合理利用内置函数对于日常的查询能起到事办功倍的作用. 常用的内置函数有以下几种分类: 日期函数 数学函数 字符函数 聚合函数 一.常用日期函数 DAYOFWEE ...

  2. 因明生物在港交所IPO招股书“失效”:亏损飙升,黄明国为董事长

    2月19日,贝多财经从港交所披露易了解到,广州因明生物医药科技股份有限公司–B(下称"因明生物")在港交所的上市申请材料已"失效",目前已经无法正常查看或下载. ...

  3. 武汉大学计算机学院黄志国书记,今日清明,为这些浙江教育人发条微信!他们值得!...

    原标题:今日清明,为这些浙江教育人发条微信!他们值得! 清明时节,祭扫祖先已成为我们的传统文化习俗.而在这个特殊的日子里,浙江教育的长河中又泛起了点点波光. 也许,他们曾是教导过你的恩师:也许,他们曾 ...

  4. 黄光裕:锻造国美“屠刀”《前程密码》

    锻造一把国美"屠刀",不仅是对他经营策略的总结,某种程度上也是对他那种"敢冒险.能执行"的性格的一种描述.他性格中的血腥的一面成就了他的今天,但是,这种性格会不 ...

  5. 揭开一个真实的国美:黑社会老大式的企业文化

    锻造一把国美"屠刀",不仅是对他经营策略的总结,某种程度上也是对他那种"敢冒险.能执行"的性格的一种描述.他性格中的血腥的一面成就了他的今天,但是,这种性格会不 ...

  6. 黄光裕“黑帮”式用人 揭开一个真实的国美

    "他一言不发,坐在宽大的老板桌后看着你,你感觉自己仿佛是笼子中的一头猎物,你不可能和他有平等对话的权利."这是国美的一场高层人才招聘面试会,主考官是由黄光裕亲自带队的十几位总监及总 ...

  7. 【闲聊】人生如梦,一樽还酹江月

    原文地址:人生如梦,一樽还酹江月作者:弥勒内院看门人 念奴娇        苏轼 大江东去,浪淘尽.千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石崩云,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰 ...

  8. 乓乓响冲刺港股:年营收2.2亿 核心收入靠给幼儿园供餐

    雷递网 雷建平 4月14日报道 乓乓响(中国)有限公司(简称:"乓乓响")日前递交招股书,准备在香港上市. 年营收超2亿 乓乓响的基地位于中国上海,向上海的企业及机构客户(大部分为 ...

  9. 乓乓响再度冲刺港股:来自临时及应急服务客户毛利率达70%

    雷递网 雷建平 10月27日 乓乓响(中国)有限公司(简称:"乓乓响")日前更新招股书,准备在香港上市. 来自临时及应急服务客户毛利率高达70% 乓乓响的基地位于中国上海,向上海的 ...

最新文章

  1. MMSE(Minimum Mean Square Error)
  2. java POI Excel 单元格样式
  3. 使用枚举定义常量更好点儿
  4. CentOS yumdownloader命令和rpmbuild命令制作rpm包
  5. AngularJS in Action读书笔记5(实战篇)——在directive中引入D3饼状图显示
  6. layer checkbox
  7. python 奥数_Python 和 奥数 — 同余法求数值
  8. VC编程中,判断野指针
  9. Ubuntu18.04安装NVIDIA显卡驱动
  10. (JavaScript案例)可拖动的模态框
  11. 微信怎么制作朋友圈H5链接
  12. 指数基金的分类以及投资方法
  13. http_code解释
  14. 不良资产证券化未来推进需跨越的障碍
  15. Centos7 切换为163 网易yum
  16. VCM 音圈电机 (马达)Voice Coil Motor
  17. 《秋雨挽歌》由迟到到其他2012-11-5
  18. ARM M3/M4单片机jlink连不上的原因
  19. DM8060驱动器的使用
  20. 浏览器显示页面排版错误

热门文章

  1. python多进程之间共享内存
  2. python解析jmeter.jtl文件_通过ant-jmeter读取jtl文件拆分数据并insert DB
  3. 使用python制作查询火车票工具
  4. 演示get_variable和Variable的区别
  5. SOHO新的生活方式
  6. python09-面向对象高级
  7. 鸟哥Linux私房菜
  8. TestNG Groups 例子
  9. javascript“圣经
  10. [Erlang 0090] RabbitMQ 集群: Mirrored Queue