6.1 PHP正则表达式介绍及作用
正则表达式是一种描述字符串结构的语法规则,是一个特定的格式化模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
对于用户来说,如果之前接触过 DOS,如果想匹配当前文件夹下所有的文件文本,可以输入"dir *.txt" 命令,按下 Enter 键后所有 ".txt"文件会被列出来。这里的"*.txt" 可以理解为一个简单的正则表达式。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
普通字符
由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。
非打印字符
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。 \f 匹配一个换页符。等价于 \x0c 和 \cL。 \n 匹配一个换行符。等价于 \x0a 和 \cJ。 \r 匹配一个回车符。等价于 \x0d 和 \cM。 \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 \t 匹配一个制表符。等价于 \x09 和 \cI。 \v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
特殊字符
所谓特殊字符,就是一些有特殊含义的字符,如上面说的”*.txt”中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中带有有*的文件,则需要对*进行转义,即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。 ( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。 * 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。 + 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。 . 匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。 [ 标记一个中括号表达式的开始。要匹配 [,请使用 \[。 ? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。 \ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\\’ 匹配 “\”,而 ‘\(’ 则匹配 “(”。 ^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。 { 标记限定符表达式的开始。要匹配 {,请使用 \{。 | 指明两项之间的一个选择。要匹配 |,请使用 \|。
限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。
*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
正则表达式的限定符有:
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 ? 匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。 {n} n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 {n,} n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。 {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
正则常用的一些场景:
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字
匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位
匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用
字符匹配
匹配由 26 个英文字母组成的字符串:^[A-Za-z]+$ 匹配由 26 个大写英文字母组成的字符串:^[A-Z]+$ 匹配由 26 个小写英文字母组成的字符串:^[a-z]+$ 匹配由数字和 26 个英文字母组成的字符串:^[A-Za-z0-9]+$ 匹配由数字、26个英文字母或者下划线组成的字符串:^\w+$ 匹配空行:\n[\s| ]*\r 匹配任何内容:[\s\S]* 匹配中文字符:[\x80-\xff]+ 或者 [\xa1-\xff]+ 只能输入汉字:^[\x80-\xff],{0,}$ 匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配数字
只能输入数字:^[0-9]*$ 只能输入n位的数字:^\d{n}$ 只能输入至少n位数字:^\d{n,}$ 只能输入m-n位的数字:^\d{m,n}$ 匹配正整数:^[1-9]\d*$ 匹配负整数:^-[1-9]\d*$ 匹配整数:^-?[1-9]\d*$ 匹配非负整数(正整数 + 0):^[1-9]\d*|0$ 匹配非正整数(负整数 + 0):^-[1-9]\d*|0$ 匹配正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 匹配负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 匹配浮点数:^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ 匹配非负浮点数(正浮点数 + 0):^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ 匹配非正浮点数(负浮点数 + 0):^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
匹配字符串
0、英文字符串:”^[A-Za-z]+$” 1、英文大写串:”^[A-Z]+$” 2、英文小写串:”^[a-z]+$” 3、英文字符数字串:”^[A-Za-z0-9]+$” 4、英数字加下划线串:”^\w+$” 5、E-mail地址:”^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$” 6、URL:”^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$
附上一些名词解释:
grep:最初是ED编辑器中的一条命令,用来显示文件中特定的内容,后来成为一个独立的工具grep。
egrep:grep虽然不断地更新升级,但仍然无法跟上技术的脚步。为此,贝尔实验室推出了egrep,意为“扩展的grep”这大大增强了正则表达式的能力。
POSIX(Portable Operating System Interface of Vnix):可移植操作系统接口。在grep发展的同时,其他一些开发人员也按照自己的喜好开发出了具有独特风格的版本。但问题也随之而来,有的程序支持某个元字符,而有的程序则不支持。因此就有了POSIX,POSIX是一系列标准,确保了操作系统之间的可移植性。但POSIX和SQL一样,没有成为最终的标准而只能作为一个参考:
Perl(Practical Extraction and Reporting Language);实际抽取与汇报语言。1987年,LarryWall发布了Perl.在随后的7年时间里,Perl经历了从Peril到现在的Perl5的发展,最终Perl成为了POSIX之后的另一个标准。
PCRE上:Perl的成功,让其他的开发人员在某种程度上要兼容Perl,包括C/C++、Java、Python等都有自己的正则表达式。1997年,Philip Hazel开发了PCRE库,这是兼容Perl正则表达式的一套正则引擎,其他开发人员可以将PCRE整合到自己的语言中,为用户提供丰富的正则功能。许多软件都使用PCRE,PHP正是其中之一。
下一篇:已是最新文章