PHP与正则表达式 | 黄乔国PHP
来源:互联网 发布:淘宝维修售后怎么处理 编辑:程序博客网 时间:2024/06/06 14:04
一、内容要点
正则的概念
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数组中
3.2 preg_replace()与preg_filter()
preg_replace($pattern,$replacement,$subject);
preg_filter($pattern,$replacement,$subject);
功能一致,只是返回值不一样
preg_replace会保留没有匹配的字符串
preg_filter不回保留没有匹配的字符串
3.3 preg_grep()
preg_grep($pattern,$subject);
阉割版的preg_filter
该函数不做替换,只做匹配
返回值是匹配到的字符串
3.4 preg_split
preg_split($pattern,$subject);
利用$pattern 匹配到的字符串作为分隔符 将$subject分割成数组并返回
可以看作是explode的高级版
3.5 preg_quote
preg_quote($str);
将$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 修正模式
贪梦模式
匹配结果存在歧义时取其长
懒惰模式
匹配结果存在歧义时取其短
U/u--懒惰匹配/贪梦匹配
i --忽略引文字母大小写
x --忽略空白
s --让元字符' . '匹配包括换行符在内的所有字符
e --
正则的概念
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);}}
阅读全文
0 0
- PHP与正则表达式 | 黄乔国PHP
- PHP与正则表达式 1
- PHP与正则表达系列之一: PHP 中的正则表达式
- php与js中的正则表达式用法
- php的字符串操作与正则表达式
- PHP学习之--字符串与正则表达式
- 4.PHP正则表达式与数组
- PHP学习之路六(php与正则表达式)
- 正则表达式之PHP篇split 与 php函数explode
- php的正则表达式
- PHP 正则表达式资料
- PHP 正则表达式
- php正则表达式介绍
- PHP 正则表达式资料
- php之正则表达式
- PHP和正则表达式
- PHP常用正则表达式
- php正则表达式实例
- 55分钟学会正则表达式
- 51Nod
- [模板]-卢卡斯(Lucas)定理
- 链表预备知识
- 中国智慧生活博览会(CEE 2017)—数字世界亚洲博览会会刊(参展商名录)
- PHP与正则表达式 | 黄乔国PHP
- 多线程串口接收数据 | 全局变量的使用
- 九大排序算法的总结与C++实现
- CSS中的盒子相关属性,盒子到底有多大
- Javascript类(对象)定义问题
- 基于java的开源论坛jforum的安装及简介
- 欢迎使用CSDN-markdown编辑器
- 在Java中如何高效的判断数组中是否包含某个元素
- static----成员变量和静态变量的区别