正则语法及在php中的应用
正则表达式是我们在编程中经常用到的一种技术,它繁琐的语法也是一种让人头疼的东西,为方便记忆,我们把正则语法进行分文别类,并结合php学习在实际项目中正则的使用。
正则表达式语法
正则表达式语法要点归类总结:
界定符,原子,量词,边界控制,模式单元
界定符:表示一个正则表达式的开始和结束,在php中界定符可以为//,##,{},即将正则表达式包裹起来。
辅助正则表达式书写的工具:regexpal
原子:原子分为可见原子和不可见原子
可见原子:unicode编码表中用键盘输出后肉眼可见的字符。
不可见原子:unicode编码表中用键盘输出后肉眼不可见的字符。
可见原子的匹配:1.匹配普通的字符时,想要匹配什么,直接写就可以;2.当匹配文字时,最好将文字转成unicode编码。3.当要匹配正则中的运算符时,要使用\进行转义
不可见原子的匹配:1.匹配空格:直接敲一个空格即可;2.匹配tab制表符:\t;3:匹配回车(换行符):\n;
元字符
元字符主要做两件事,一件事是定义原子的筛选方式,第二件事是将某类字符进行分类,给出一个缩写形式(即定义原子的集合)
原子的筛选方式:
| 匹配两个或者多个分支选择
[] 匹配方括号中的任意一个原子
[^] 匹配除方括号中的原子之外的任意字符
原子的集合:
1: . 匹配除换行符之外的任意字符 即[^\n]
2:\d 匹配任意一个十进制数字,即[0-9]
3: \D 匹配任意一个非十进制的数字,即[^0-9]
4: \s 匹配一个不可见原子,即[\f\n\r\t\v]
5: \S匹配一个可见原子,即[^\f\n\r\t\v]
6: \w 匹配任意一个数字,字母,下划线,即 [0-9a-zA-Z_]
7: \W 匹配任意一个非数字,字母或下划线,即[^0-9a-zA-Z_]
量词
{n} 表示其前面的原子恰好出现n次
{n,} 表示其前面的原子最少出现n次
{n,m} 表示其前面的原子最少出现n次,最多出现m次
* 匹配0次,1次或者多次其之前的原子{0,}
+ 匹配1次或者多次其之前的原子,,即{1,}
? 匹配0次或者1次其之前的原子,即{0,1}
边界控制
^ 限制必须以规定的开始
$ 限制必须以规定的结尾
模式控制
() 匹配其中的整体为一个原子
修正模式
贪婪匹配,懒惰匹配,忽略大小写
贪婪匹配:匹配结果存在歧义时取其长
懒惰匹配:匹配结果存在歧义时取其短
下面看一个实例:
运行结果:
那正则表达式都有哪些修正模式呢,又如何书写呢?
U/u 懒惰匹配/贪婪匹配
小写 i 忽略英文字母的大小写
小写 x 忽略空白
小写 s 让元字符 ‘.’ 匹配包括换行在内的所有字符
如果想要同时使用多种修正模式可以这样写 $pattern=’/fdf/Ui’
Php结合正则表达式:
Php中常用的正则表达式函数:
Preg_match($pattern,$subject,[array &$matches])
Preg_match_all($pattern,$subject,array &$matches)
上述两个函数返回的结果都是匹配到的结果的次数。
Preg_replace($pattern,$replacement,$subject)
Preg_filter($pattern,$replacement,$subject)
以上两个函数是将$subject中匹配$pattern规则的数据替换成$replacement
这两个函数除了可以操作字符串,还可以操作替换数组。实例:
输出结果:
那么这两个函数有什么区别呢?
当我们把$subject也换成数组时,就会发现区别,实例代码:
运行结果:
Preg_replace()会将不包含匹配规则的数据(即没有发生替换的)进行保留,而preg_filter()不会保留。
Preg_grep($pattern,array $input):返回匹配到的数据(只匹配不替换)
实例代码:
运行结果:
Preg_split($pattern,$subject):以匹配$pattern规则的字符做为分隔字符串,将$subject进行分隔,将分隔的结果以数组的形式返回。就是一个升级版的explode()函数
代码实例:
运行结果:
Preg_qoute($str):将正则运算符进行转义
代码实例:
运行结果:
那php中提供了这么多的正则函数,我们怎么记住他们呢?其实它们是有几点共性的
1.都以preg_开头
2.除preg_quote函数外,第一个参数都是正则表达式
3.Preg_match:用于表单验证等
4.Preg_replace:用于非法词语过滤等
实战应用
常见正则表达式的书写
非空:/.+/
匹配保留两位小数的浮点数:/\d+\.\d{2}$/
手机号匹配:/1[34578]\d{9}/或者/1(3|4|5|7|8)\d{9}/
Email地址:/^\w+(\.\w+)*@\w+(\.\w+)+$/
匹配url: /^(https?://)?(\w+\.)+(com|cn)$/
正则的应用很广泛,php中的smarty模板和路由规则就充分用到了正则,后续的篇章将利用正则编写简单的smarty模板,以加深我们对smarty的理解。