PHP中使用正则表达式(一)

1. 正则表达式

正则表达式,又称正规表示式正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
------ From Wikipedia

正则表达式其实就是一组字符串,它是由字母、数字、符号组成按照一定的规则组成的。可以把正则表达式理解为一种“模式”,一般当需要对字符串进行处理,而自带的函数(例如PHP自带的字符串处理函数)满足不了要求的时候,就会选择使用正则表达式。使用正则表达式可以对指定的字符串进行查找、替换、分割等操作。

PHP 5.3.0之前支持两种类型的正则表达式:

  • POSIX正则表达式
  • PERL正则表达式

POSIX正则表达式和PERL正则表达式的语法几乎是相同的,它们之间的区别主要在于以下两点:
1. 定界符

POSIX正则表达式没有定界符,PERL正则表达式有定界符。

PERL正则表达式:  /\d{4}\W\d{2}\W\d{2}/        
POSIX正则表达式:  \d{4}\W\d{2}\W\d{2}

以上的正则表达式都可以匹配类似于“2016-08-19”这样的时间格式。在PERL正则表达式中开始和结束位置上的两个字符"/",就是定界符。

2. 修正符

POSIX正则表达式没有修正符,PERL正则表达式有修正符。

PERL正则表达式:  /bob/i
POSIX正则表达式:  bob

以上的正则表达式用来匹配特定的单词,其中在PERL正则表达式中最后一个字符"i"就是修正符,它是对正则表达式的扩展,"i"表示忽略大小写。也就是说PERL的正则表达式除了可以匹配含有bob的字符串,还可以匹配含有"Bob","BOB"等所有三个字母大小写放在一起的组合的字符串。

但是PHP在5.3.0以后就不再支持POSIX风格的正则表达式,所以这里就介绍PERL正则表达式。

2.PERL正则表达式语法

一个PERL正则表达式可以由定界符、用于匹配的元素(原子)、元字符、模式修正符组成。

2.1 定界符

/\d{4}\W\d{2}\W\d{2}/

上面的正则表达式开始和结束位置上面两个"/"就是定界符,定界符是正则表达式的边界。规定除了数字、字母、反斜杠(\)不能用做定界符,其余的符号都可以用做定界符。常用的定界符就是"/"、"#"。

**2.2 用于匹配的元素(原子)**
>```
/a{2}\W\d{4}[h-z]/

顾名思义,用于匹配的元素是正则表达式中最基本的成员,它就是被拿来和目标字符串进行匹配的东西。在上面的正则表达式中"a{2}"、"\W"、"\d{4}"、"[h-z]"都是用于匹配的元素。在正则表达式中以下元素可以用做匹配的元素:
(1). 所有的数字、字母。 例如:1、2、3、a、b等。
(2). 被元字符修饰的数字或字母。例如:a{2}、[h-z]等。
(3). 元字符也可以用作匹配的字符,但是需要用转义字符("")进行处理。例如:\* 、\+ 分别用来匹配*和+。
(4). 许多普通的字母被转以字符修饰后表示一些特殊的含义也可以用作匹配的元素。例如:\w 表示匹配任意一个字,如字母、数字、下划线。\W表示匹配任意一个非字。

2.3 元字符

元字符被用来修饰用于匹配的元素。不可以单独出现!下面对常用的元字符进行总结。
(1) * 表示它前面的元素可以出现0次至多次。
(2) + 表示它前面的元素可以出现1次或者多次。
(3) ? 表示它前面的元素可以出现0次或者1次。
(4) . 可以匹配除换行符外任意一个字符,它和*组合可以匹配任意的字符或者字符串。
(5) [] 表示匹配"[]"内表示的范围的任意一个字符、数字:

/[a-z]/     可以匹配任意一个处于a和z之间的字母

(6) {} 表示它前面的字符可以出现的次数:

/a{m}/        表示a可以出现m次
/a{m,n}/      表示a至少出现m次,至多出现n次(n>m)
/a{m,}/       表示a至少出现m次

*可以表示为{0,} +可以表示为{1,} ?可以表示为{0,1}
(7) ^ 在一个正则表达式开始的位置出现,表示字符串必须以这个正则表达式开始:

/^abc/      匹配所有以abc开始的字符串

^出现在[]里面表示匹配[]表示的范围之外的元素:

/[^a-z]/     匹配在a到z范围之外的所有字符     

(8) $ 在一个正则表达式结束的位置出现,表示字符串必须以这个正则表达式结束:

/abc$/       匹配所有以abc结束的字符串

(9) | 表示或的关系

(abc|abd)    匹配字符串abc或者abd

(10) ( ) 括号, 作用如下:
(i) 把单个的元素用括号括起来作为一个整体使用
(ii) 改变优先级:加上括号可以提高优先级。
(iii) 作为子模式使用 :
在下面所说的 preg_match 方法中,结果会被赋值到 $arr 变量中,先匹配外层模式,再匹配内层模式。

$pattern="/(\d{4}(\W)\d{2}\W\d{2})\s+(\d{2}(\W)\d{2}\W\d{2})\s+(?:am|pm)/"; //正则表达式模式
$string="today is 2010/09/15 15:35:28 pm..."; //需要和上面模式字符串进行匹配的变量字符串
if(preg_match($pattern, $string, $arr)){
print_r($arr);
}

结果

Array
(
    [0] => 2010/09/15 15:35:28 pm
    [1] => 2010/09/15
    [2] => /
    [3] => 15:35:28
    [4] => :
)

当我们在一个正则表达式中需要重复用到一个子模式时,可以进行反向引用,直接在模式中把子模式提取出来然后再进行使用。\1 取第一个子模式、 \2取第二个子模式,但是注意是单引号还是双引号引起来的正则表达式,因为在双引号引起来的正则表达式中,它是可以解释转义字符的,所以 \1 必须要写成 \1。 在单引号引起来的正则表达式中,则不会出现这种情况,\1 仍然可以写成 \1:

$pattern1="/(\d{4}(\W)\d{2}\W\d{2})\s+(\d{2}(\W)\d{2}\W\d{2})\s+(?:am|pm)/"
$pattern2="/(\d{4}(\W)\d{2}\\1\d{2})\s+(\d{2}(\W)\d{2}\\2\d{2})\s+(?:am|pm)/"

上面的两个正则表达式表示的是一个意思。(\W)作为第一个子模式被使用过了,所以就被存储起来,\\1就表示它。同理\\2也可以这么理解

当我们不想把括号内的整体作为一个在匹配的时候作为一个子模式,可以在模式前面加上"?:"即可。上面的正则表达式中(?:am|pm)在匹配时并没有作为子模式进行匹配。

元字符的优先级
1)\ 转义符最高
2)(),(?:) 括号其次
3)* + ? {}
4)^ $ \b
5)|

2.4 模式修正符
模式修正符就是几个特殊字母,放在正则表达式的结尾。它的作用就是用来扩展正则表达式的功能,可以单独使用也可以几个放在一起使用。
常见的模式修正符:

i 表示在用模式进行匹配的时候不区分大小写
m 表示把要匹配的目标字符串的每一行都当作一个整体的字符串来进行匹配,这个修正符主要是对元字符^和$产生影响。例如:

str = "abc
       efg
       23";
pattern = "/^efg/m"

使用上面的正则表达式来匹配str字符串就会匹配到efg。但是如果正则表达式的结尾不加上m就会匹配不到任何字符。
x 表示忽略正则表达式中的空格。例如:

pattern = "/a b c/";
str = "abc";

使用上面的正则表达式依然可以匹配到str。
e 正则表达式必须使用在 preg_replace 函数中使用
A 表示必须以正则表达式开头,相当于加上^
Z 表示必须以正则表达式结尾,相当于加上$
U 表示取消贪婪模式(表示在成功匹配的前提下尽可能多的匹配)

参考文章链接:
http://cuiqingcai.com/1186.html
https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
http://58582786.blog.51cto.com/1550000/1346431
声明:本篇文章为作者在学习正则表达式时的总结,文章中的内容有来自互联网的,并非自己100%原创。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容