PHP正则表达式

很久之前就接触过正则表达式,但一直没有系统的去学习,今天看了一些关于PHP正则表达式的视频后,把学习的知识记录下来,以备后用。

PHP的正则有两类,一类是PCRE(兼容Perl),在PHP中以preg开头的函数,另一类是POSIX Regex,这套正则已经过时,不建议使用。

关于PCRE(兼容Perl)的说明:

PCRE表达式分为4部分,分别是定界符、原子、元字符和模式修正符(或模式修饰符)

1、定界符

定界符是必需使用的符,一般由两个相同的符号组成,理论上除了反斜杠(\)外的所有字符都可以,但常用斜杠(/)来作为分界符,如:/abc/

2、原子

原子即要匹配的内容,如要匹配3,那3就是原子,要匹配bbb,bbb就是原子;也可以用转义符号来表示一组要匹配的内容,如\d代表匹配所有数字,这时\d就是原子。 需要注意的是,在一个正则表达式中,至少要有一个原子。
1)、原子包含什么

原子包含打印字符和非打印字符。打印字符可以理解为键盘上能打出来的字符,如a-zA-Z~!@#$%^等等;非打印字符比如回车、制表符等

2)、转义字符(\)的作用

a、将有意义的字符转成没有意义的原子字符,如匹配^,要写成\^,因为^是一个有意义的字符

b、将没有意义的字符转成有意义的原子字符,如匹配回车,要写成\n

c、假如一个字符加上转义符后也没有其他意义,这时加不加都是一样的效果,如\h,这个是没有意义的,所以\h与h表示的都是字符h

3)、匹配多个原子

a、系统提供的:

 \d 

代表任意一个数字的字符,如/\d/

 \D 

代表任意一个非数字的字符,如/\D/

 \w 

代表任意一个字的字符,a-zA-Z0-9_,如/\w/

 \W 

代表任意一个非字的字符,除了a-zA-Z0-9_外的所有字符,如*-+/

 \s 

代表任意一个空白的字符,如回车、空格、制表符等

 \S 

代表任意一个非空白非的字符,如除了回车、空格、制表符等的字符


b、用户可自定义的:

单独指定要匹配的字符,如匹配13579,则写[13579]
  匹配范围:如匹配所有字母的字符,则写[a-zA-Z],其中-是一个区间范围
  匹配不在范围:如匹配除了所有字母的字符,则写[^a-zA-Z],其中^是除了的意思
匹配所有原子,则写.

3、元字符

元字符不能单独使用,是用来修饰原子,扩展原子功能和限定功能的,要写在定界符里面。如3{3},{3}就是元字符,表示查找333。

元字符表

*

修饰其前的原子出现0次、1次或多次,必需放在原子后面,可以理解为{0,}

+

修饰其前的原子出现1次或多次,即至少要出现一次,必需放在原子后面,可以理解为{1,}

?

修饰其前的原子出现0次或1次,必需放在原子后面,可以理解为{0,1}

{n}

n代表数字,表示其前的原子只能出现n次,必需放在原子后面

{n,m}

n和m代表数字,表示其前的原子至少出现n次,最多出现m次,必需放在原子后面。

表示两边的原子只要有一个出现就可以满足,但是|优先级是最低的,如果想改变优先级,可以用括号()

{n,}

n代表数字,表示其前的原子出现不小于n次,必需放在原子后面

|

匹配两个或多个分支选择,或者的关系

^或\A

匹配输入字符串的开始位置(或在多行模式下行的开头,即紧随一个换行符之后),必需写在正则表达式的最前面。

如/^abc/表示以abc开头的字符串

$或\Z

匹配输入字符串的结束位置(或在多行模式下行的结尾,即紧随一个换行符之前)必需写在正则表达式的最后面。

如:/abc$/表示以abc结束的字符串

\b

匹配单词的边界

\B

匹配除单词边界以外的部分。

如:字符串this is island,这里面有3个is

表达式为:/\bis\b/,会匹配出中间的is。

表达式为:/\bis\B/,会匹配出island中的is。

表达式为:/\Bis\b/,会匹配出this中的is。

()

1、改变优先级别

2、将小原子变成大原子

如/mysql+/表示mysq后面的l要出现一次或多次,但如果是/(mysql)+/,表示mysql这个单词要出现一次或多次

3、子模式,整个表达式是一个大的模式,小括号中的是每个独立的子模式

如:字符串this http://www.xxx.com mysqloracle,表达式为:/(http|https|ftp)\:\/\/(www)\.(.*?)\.(com|net|org)/

这样在正则之后的结果,可以将每个括号的中的内容单独提取出来

4、反向引用

如:字符串:this 2014-11-05 mysqloracle,表达式为:/\d{4}-\d{2}-\d{2}/,这时可以匹配出来日期2014-11-05

但如果日期改变2014/11/05,就无法匹配出来,可以将表达式改为/\(d{4})(-|\/)\d{2}(-|\/)\d{2}/

但这时日期格式如果为2014/11-05也可以匹配出来,所以可以将子模式反过来用在正则表达式里面,

即将表达式改为/\(d{4})(-|\/)\d{2}\1\d{2}/,其中\1代表取出第1个子模式里面的内容,

在这里为-或/

5、如果想将括号的功能作为改变优先级和将小原子变成大原子使用,而不要让它产生子模式和反向引用的作用,可以在(后面加上?:

如:/\(?:d{4})(-|\/)\d{2}(-|\/)\d{2}/,这样匹配出来的2014就不会变成子模式中的一部分

4、模式修正符(模式修饰符)

模式修正符用来对模式(正则)修正用的,用来修正正则表达式的解释或扩充正则表达式的功能。

1)、模式修正符要写在定界符外面,放在右边。如/b{3}/i,其中i就是模式修正符,这是里表示不区分大小写。

2)、模式修正符中,一个字符是一个功能,可以组合使用,不分先后顺序。如:/go*gle/ieU

常用修正符表:

 i 

不区分大小定,默认是区分大小写的

 m 

将字符串为多行,当在使用^或$时,每一行满足条件都可以,默认将字符串视为一行处理

s

修正正则表达式中的.可以匹配换行符,默认.不能匹配回车换行

x

可以省略正则表达式中的空白处

e

与preg_replace配合使用

u

取消正则表达式的贪婪模式

如:字符串为this is <b>test</b> web <b>server</b>,表达式为/\<b\>(.*)\<\/b\>/i

这里取到的结果为test</b> web <b>server,与想要的结果不符,这时可以使用U修正符

但这种符号与perl不兼容,可以用另一种方式来取消贪婪模式

可以用/\<b\>(.*?)\<\/b\>/i来取消贪婪模式

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值