正则语法及在php中的应用

正则表达式是我们在编程中经常用到的一种技术,它繁琐的语法也是一种让人头疼的东西,为方便记忆,我们把正则语法进行分文别类,并结合php学习在实际项目中正则的使用。

正则表达式语法

 

 

正则表达式语法要点归类总结:

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

界定符:表示一个正则表达式的开始和结束,在php中界定符可以为//,##,{},即将正则表达式包裹起来。

辅助正则表达式书写的工具:regexpal

原子:原子分为可见原子和不可见原子

可见原子:unicode编码表中用键盘输出后肉眼可见的字符。

不可见原子:unicode编码表中用键盘输出后肉眼不可见的字符。

可见原子的匹配:1.匹配普通的字符时,想要匹配什么,直接写就可以;2.当匹配文字时,最好将文字转成unicode编码。3.当要匹配正则中的运算符时,要使用\进行转义

不可见原子的匹配:1.匹配空格:直接敲一个空格即可;2.匹配tab制表符:\t3:匹配回车(换行符):\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的理解。

 

posted @ 2016-06-19 15:08  房天下问答  阅读(212)  评论(0编辑  收藏  举报