正则表达式入门

规则

字符类

表达式 匹配值
\d digit,数字
\w word,字母或数字或下划线,也就是a-z,A-Z,0-9
\s space,空格、制表符、换行符
\r return,回车符
\n next line,换行符
\t tab,制表符
. 除换行符(\r)以外的任意字符
[abc] abc中的任意一个字符
[^abc] abc以外的任意一个字符
[a-z] a到z中的任意一个字符

匹配位置

表达式 含义
\b 单词边界
^ 开头
$ 结尾

匹配次数

表达式 含义
{n} 匹配n次
{n,m} 匹配n到m次
{n,} 至少匹配n次
? 匹配0次或1次,相当于{0,1}
* 匹配任意次,相当于{0,}
+ 至少匹配1次,相当于{1,}

分组

表达式 含义
(\w)\1 这里的\1表示第一个括号里匹配到的字符,(\w)\1匹配”deep”中的”ee”

一些示例

// 匹配图片地址
<img[^>]*src=["|']([^"']*)["|']

// 匹配链接地址
<a[^>]+href="(.*?)"

\b 匹配单词的开始和结束 <?php $s=”good morning, hi, i’m zhupp!”; $p=”/\bhi\b/”; preg_match_all($p, $s, $o); var_dump($o);exit; ?> array(1) { [0]=> array(1) { [0]=> string(2) “hi” } } . 匹配除换行符之外的任意字符 <?php $s=”hi, bye zhupp good bye”; $p=”/hi.bye/”; preg_match_all($p, $s, $o); var_dump($o);exit; ?> array(1) { [0]=> array(1) { [0]=> string(7) “hi, bye” } } * 匹配前面任意数量的字符(包括0个) <?php $s=”hi, bye zhupp good bye”; $p=”/bye/”; preg_match_all($p, $s, $o); var_dump($o);exit; ?> array(1) { [0]=> array(2) { [0]=> string(3) “bye” [1]=> string(3) “bye” } } + 匹配前面的一个以上的字符 {2,} 前面的表达式必须连续匹配2个以上的 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次 <?php $s=”hi, bbye

zhupp i’m 18 good bye”; $p=”/b{2,}/”; preg_match_all($p, $s, $o); var_dump($o);exit; ?> array(1) { [0]=> array(1) { [0]=> string(2) “bb” } } ? 匹配0次或者1次 <?php $s=”3xxx”; $p=”/\d?/”; preg_match_all($p, $s, $o); var_dump($o);exit; ?> array(1) { [0]=> array(5) { [0]=> string(1) “3” [1]=> string(0) “” [2]=> string(0) “” [3]=> string(0) “” [4]=> string(0) “” } } \d 匹配数字 <?php $s=”hi, bye zhupp i’m 18 good bye”; $p=”/\d{1,}/”; preg_match_all($p, $s, $o); var_dump($o);exit; ?> array(1) { [0]=> array(1) { [0]=> string(2) “18” } } \s 匹配任意的空白符(TAB、空格、换行、中文空格) <?php $s=”hi

zhupp i’m 18 good bye”; $p=”/hi\szhu/”; preg_match_all($p, $s, $o); var_dump($o);exit; ?> \w 匹配字母或数字或下划线或汉字等 <?php $s=”zhupp i’m 18 good bye”; $p=”/zhu\wp/”; preg_match_all($p, $s, $o); var_dump($o);exit; ?> array(1) { [0]=> array(1) { [0]=> string(5) “zhupp” } }

匹配字符串的开始,$匹配字符串的结束 <?php $s=”i’m 18,yeah”; $p=”/^i.*h$/”; preg_match_all($p, $s, $o); var_dump($o);exit; ?> array(1) { [0]=> array(1) { [0]=> string(11) “i’m 18,yeah” } } [] 匹配方括号里的任一个字符 匹配email <?php $s=”hi my email address is xiaozhuzhu_123.k@126.com, call me later !”; $p=”/\s+(\w+[-_.]\w+@\w+.\w+)/”; preg_match($p, $s, $o); var_dump($o);exit; ?> array(2) { [0]=> string(25) “ xiaozhuzhu_123.k@126.com” [1]=> string(24) “xiaozhuzhu_123.k@126.com” }

模式定界符后面的 “i” 表示不区分大小写字母的搜索

i:非大小写敏感模式,:如果设定此修正符,模式中的字符将同时匹配大小写字母。

  m:多行模式,当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。

  s:单行模式,如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。

u:贪婪模式

3 正则表达式的基本语法:

一个正则表达式,分为三个部分:分隔符,表达式和修饰符。 

分隔符可以是除了特殊字符以外的任何字符(比如"/ !"等等),常用的分隔符是"/"。表达式由一些特殊字符(特殊字符详见下面)和非特殊的字符串组成,比如"[a-z0-9_-]+@[a- z0-9_-.]+"可以匹配一个简单的电子邮件字符串。修饰符是用来开启或者关闭某种功能/模式。下面就是一个完整的正则表达式的例子: 

/hello.+?hello/is

上面的正则表达式"/"就是分隔符,两个"/"之间的就是表达式,第二个"/"后面的字符串"is"就是修饰符。 

在表达式中如果含有分隔符,那么就需要使用转义符号"\",比如"/hello.+?\/hello/is"。转义符号除了用于分隔符外还可以执行特殊字符,全部由字母构成的特殊字符都需要"\"来转义,比如"\d"代表全体数字。

4 正则表达式的特殊字符:

正则表达式中的特殊字符分为元字符、定位字符等等。 

元字符是正则表达式中一类有特殊意义的字符,用来描述其前导字符(即元字符前面的字符)在被匹配的对象中出现的方式。元字符本身是一个个单一的字符,但是不同或者相同的元字符组合起来可以构成大的元字符。 

元字符:

大括号:大括号用来精确指定匹配元字符出现的次数,例如"/pre{1,5}/"表示匹配的对象可以是"pre"、"pree"、"preeeee"这样在"pr"后面出现1个到5个"e"的字符串。或者"/pre{,5}/"代表pre出现0此到5次之间。 

加号:"+"字符用来匹配元字符前的字符出现一次或者多次。例如"/ac+/"表示被匹配的对象可以是"act"、"account"、"acccc"等在"a"后面出现一个或者多个"c"的字符串。"+"相当于"{1,}"。 

星号:"*"字符用来匹配元字符前的字符出现零次或者多次。例如"/ac*/"表示被匹配的对象可以是"app"、"acp"、"accp"等在"a"后面出现零个或者多个"c"的字符串。"*"相当于"{0,}"。 

问号:"?"字符用来匹配元字符前的字符出现零次或者1次。例如"/ac?/"表示匹配的对象可以是"a"、"acp"、"acwp"这样在"a"后面出现零个或者1个"c"的字符串。"?"在正则表达式中还有一个非常重要的作用,即"贪婪模式"。 

 还有两个很重要的特殊字符就是"[ ]"。他们可以匹配"[]"之中出现过的字符,比如"/[az]/"可以匹配单个字符"a"或者"z";如果把上面的表达式改成这样"/[a-z]/",就可以匹配任何单个小写字母,比如"a"、"b"等等。 

如果在"[]"中出现了"^",代表本表达式不匹配"[]"内出现的字符,比如"/[^a-z]/"不匹配任何小写字母!并且正则表达式给出了几种"[]"的默认值: 

[:alpha:]:匹配任何字母

[:alnum:]:匹配任何字母和数字

[:digit:]:匹配任何数字

[:space:]:匹配空格符

[:upper:]:匹配任何大写字母

[:lower:]:匹配任何小写字母

[:punct:]:匹配任何标点符号

[:xdigit:]:匹配任何16进制数字

另外下面这些特殊字符在转义符号”"转义后代表的含义如下:

s:匹配单个的空格符

S:用于匹配除单个空格符之外的所有字符。

d:用于匹配从0到9的数字,相当于”/[0-9]/”。

w:用于匹配字母,数字或下划线字符,相当于”/[a-zA-Z0-9_]/”。

W:用于匹配所有与w不匹配的字符,相当于”/[^a-zA-Z0-9_]/”。

D:用于匹配任何非10进制的数字字符。

.:用于匹配除换行符之外的所有字符,如果经过修饰符”s”的修饰,”.”可以代表任意字符。

利用上面的特殊字符可以很方便的表达一些比较繁琐的模式匹配。例如"/\d0000/"利用上面的正则表达式可以匹配万以上,十万一下的整数字符串。 

定位字符:

定位字符是正则表达式中又一类非常重要的字符,它的主要作用是用于对字符在匹配对象中的位置进行描述。 

^:表示匹配的模式出现在匹配对象的开头(和在”[]”里面不同)

$:表示匹配的模式出现在匹配对象的末尾

空格:表示匹配的模式出现在开始和结尾的两个边界之一

”/^he/”:可以匹配以”he”字符开头的字符串,比如hello、height等等;

“/he$/”:可以匹配以”he”字符结尾的字符串即she等;

”/ he/”:空格开头,和^的作用一样,匹配以he开头的字符串;

“/he /”:空格结束,和$的作用一样,匹配以he结尾的字符串;

”/^he$/”:表示只和字符串”he”匹配。

括号:

正则表达式除了可以用户匹配,还可以用括号"()"来记录需要的信息,储存起来,给后面的表达式读取。比如: 

/^([a-zA-Z0-9-]+)@([a-zA-Z0-9-]+)(.[a-zA-Z0-9_-])$/

就是记录邮件地址的用户名,和邮件地址的服务器地址(形式为username@server.com之 类的),在后面如果想要读取记录下来的字符串,只是需要用”转义符+记录的次序”来读取。比如”\1”就相当于第一个”[a-zA- Z0-9-]+”,”\2”相当于第二个([a-zA-Z0-9-]+),”\3”就是第三个(.[a-zA-Z0-9_-])。但是在PHP 中,”"是一个特殊的字符,需要转义,所以”\1”到了PHP的表达式中就应该写成”\\1”。

其他特殊符号:

“:或符号” “和PHP里面的或一样,不过是一个” “,而不是PHP的两个”   “!意思就是可以是某个字符或者另一个字符串,比如”/abcd dcba/”可能匹配”abcd”或者”dcba”。

5 贪婪模式:

前面在元字符中提到过”?”还有一个重要的作用,即”贪婪模式”,什么是”贪婪模式”呢?

比 如我们要匹配以字母”a”开头字母”b”结尾的字符串,但是需要匹配的字符串在”a”后面含有很多个”b”,比如”a bbbbbbbbbbbbbbbbb”,那正则表达式是会匹配第一个”b”还是最后一个”b”呢?如果你使用了贪婪模式,那么会匹配到最后一个”b”,反 之只是匹配到第一个”b”。

使用贪婪模式的表达式如下: 

/a.+?b/

/a.+b/U

不使用贪婪模式的如下:

/a.+b/

上面使用了一个修饰符U,详见下面的部分。

6 修饰符:

在正则表达式里面的修饰符可以改变正则的很多特性,使得正则表达式更加适合你的需要(注意:修饰符对于大小写是敏感的,这意味着"e"并不等于"E")。正则表达式里面的修饰符如下: 

i :如果在修饰符中加上”i”,则正则将会取消大小写敏感性,即”a”和”A” 是一样的。

m:默认的正则开始”^”和结束”$”只是对于正则字符串如果在修饰符中加上”m”,那么开始和结束将会指字符串的每一行:每一行的开头就是”^”,结尾就是”$”。

s:如果在修饰符中加入”s”,那么默认的”.”代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符!

x:如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。

e:本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。

A:如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说”/a/A”匹配”abcd”。

E:与”m”相反,如果使用这个修饰符,那么”$”将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。

U:和问号的作用差不多,用于设置”贪婪模