简单的说,正则表达式是一种可以用于模式匹配和替换的强大工具。
在某个Linux网站上面有这样的话:"如果你问一下Linux爱好者最喜欢什么,他可能会回答正则表达式;如果你问他最害怕什么,除了繁琐的安装配置外他肯定会说正则表达式。"
正如上面说的,正则表达式看起来非常复杂,让人害怕,大多数的PHP初学者都会跳过这里,继续下面的学习,但是PHP中的正则表达式有着可以利用模式匹配找到符合条件的字符串、判断字符串是否合乎条件或者用指定的字符串来替代符合条件的字符串等强大的功能,不学实在太可惜了……
一个正则表达式,分为三个部分:分隔符,表达式和修饰符。
分隔符可以是除了特殊字符以外的任何字符(比如"/ !"等等),常用的分隔符是"/"。
/hello.+?hello/is
上面的正则表达式"/"就是分隔符,两个"/"之间的就是表达式,第二个"/"后面的字符串"is"就是修饰符。
在表达式中如果含有分隔符,那么就需要使用转义符号"\",比如"/hello.+?\/hello/is"。转义符号除了用于分隔符外还可以执行特殊字符,全部由字母构成的特殊字符都需要"\"来转义,比如"\d"代表全体数字。
正则表达式中的特殊字符分为元字符、定位字符等等。
元字符是正则表达式中一类有特殊意义的字符,用来描述其前导字符(即元字符前面的字符)在被匹配的对象中出现的方式。
- 大括号:大括号用来精确指定匹配元字符出现的次数,例如"/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"的字符串。"?"在正则表达式中还有一个非常重要的作用,即"贪婪模式"。
- [: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"的修饰,"."可以代表任意字符。
- ^:表示匹配的模式出现在匹配对象的开头(和在"[]"里面不同)
- $:表示匹配的模式出现在匹配对象的末尾
- 空格:表示匹配的模式出现在开始和结尾的两个边界之一
- "/^he/":可以匹配以"he"字符开头的字符串,比如hello、height等等;
- "/he$/":可以匹配以"he"字符结尾的字符串即she等;
- "/ he/":空格开头,和^的作用一样,匹配以he开头的字符串;
- "/he /":空格结束,和$的作用一样,匹配以he结尾的字符串;
- "/^he$/":表示只和字符串"he"匹配。
前面在元字符中提到过"?"还有一个重要的作用,即"贪婪模式",什么是"贪婪模式"呢?
比如我们要匹配以字母"a"开头字母"b"结尾的字符串,但是需要匹配的字符串在"a"后面含有很多个"b",比如"a bbbbbbbbbbbbbbbbb",那正则表达式是会匹配第一个"b"还是最后一个"b"呢?如果你使用了贪婪模式,那么会匹配到最后一个"b",反之只是匹配到第一个"b"。
使用贪婪模式的表达式如下:
/a.+?b/
/a.+b/U
不使用贪婪模式的如下:
/a.+b/
上面使用了一个修饰符U,详见下面的部分。
- i :如果在修饰符中加上"i",则正则将会取消大小写敏感性,即"a"和"A" 是一样的。
- m:默认的正则开始"^"和结束"$"只是对于正则字符串如果在修饰符中加上"m",那么开始和结束将会指字符串的每一行:每一行的开头就是"^",结尾就是"$"。
- s:如果在修饰符中加入"s",那么默认的"."代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符!
- x:如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。
- e:本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。
- A:如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说"/a/A"匹配"abcd"。
- E:与"m"相反,如果使用这个修饰符,那么"$"将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。
- U:和问号的作用差不多,用于设置"贪婪模式"。
PCRE相关的正则表达式函数:
PHP的Perl兼容正则表达式提供的多个函数,分为模式匹配,替换和匹配数目等等:
1、preg_match :
函数格式:int preg_match(string pattern, string subject, array [matches]);
这个函数会在string中使用pattern表达式来匹配,如果给定了[regs],就会将string记录到[regs][0]中, [regs][1]代表使用括号"()"记录下来的第一个字符串,[regs][2]代表记录下来的第二个字符串,以此类推。preg如果在string 中找到了匹配的pattern,就会返回"true",否则返回"false"。
2、preg_replace :
函数格式:mixed preg_replace(mixed pattern, mixed replacement, mixed subject);
这个函数会使用将string中符合表达式pattern的字符串全部替换为表达式replacement。如果replacement中需要包含pattern的部分字符,则可以使用"()"来记录,在replacement中只是需要用"\1"来读取。
3、preg_split :
函数格式:array preg_split(string pattern, string subject, int [limit]);
这个函数和函数split一样,区别仅在与split可以使用简单正则表达式来分割匹配的字符串,而preg_split使用完全的Perl兼容正则表达式。第三个参数limit代表允许返回多少个符合条件的值。
4、preg_grep :
函数格式:array preg_grep(string patern , array input);
这个函数和preg_match功能基本上,不过preg_grep可以将给定的数组input中的所有元素匹配,返回一个新的数组。
function emailIsRight( $email ) {
if ( preg_match ( " ^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3}$ " , $email )) {
return 1 ;
}
return 0 ;
}
if (emailIsRight( ' y10k@963.net ' )) echo ' 正确<br> ' ;
if ( ! emailIsRight( ' y10k@fffff ' )) echo ' 不正确<br> ' ;
?>