正则表达式
概述: 1:定界符: 把要匹配的内容放到 // 或者 ||,例如 /php/ |php| 2:元字符:* 其前导字符必须在目标对象中出现0次、1次或连续多次; . 用于匹配除换行符之外的所有字符1次; ? 其前导匹配对象连续出现0次或1次; + 其前导匹配对象连续出现1次或多次; | 选择匹配类似PHP中的| (因为这个运算符合是弱类型导致前面最为整体匹配); ^ 匹配对象出现在字符串的首部; $ 匹配对象出现在字符串尾部 {m} 匹配前一个内容的重复次数为M次; {m,} 匹配前一个内容的重复次数大于等于M次; {m,n} 匹配前一个内容的重复次数M次到N次; ( ) 合并整体匹配,并放入内存,可使用1 2?依次获取; b 出现在目标字符串的开头或结尾的两个边界之一,边界可以是空格或者特殊字符; B 对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾; s: 用于匹配单个空格符,包括tab键和换行符,等价于[ftv]; S: 用于匹配除单个空格符之外的任何一个字符,[^ftv]; d: 匹配从0到9的一个数字,等价于[0-9]; D 匹配除数字以外任何一个字符,等价于[^0-9]; w: 用于匹配一个字母、数字或下划线字符,等价于[0-9a-zA-Z_]; W: 用于匹配所有除英文字母、数字和下划线以外任何的一个字符,[^0-9a-zA-Z_]; A 匹配字符串串首的原子 Z 匹配字符串串尾的原子 f 匹配一个换页符等价于 x0c 或 cL n 匹配一个换行符;等价于 x0a 或 cJ r 匹配一个回车符等价于x0d 或 cM t 匹配一个制表符;等价于 x09或cl v 匹配一个垂直制表符;等价于x0b或ck oNN 匹配一个八进制数字 xNN 匹配一个十六进制数字 cC 匹配一个控制字符 3:指定某一个范围而不局限于具体的字符 /[A-Z]/ 上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。 /[a-z]/ 上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。 /[0-9]/ 上述正则表达式将会与从0到9范围内任何一个数字相匹配。 /([a-z][A-Z][0-9])+/ 上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。 4:特殊符号的用法 ①:1 提取第一位的属性 例如 /^d{2} ([W])d{2}1d{4}$/ 匹配“12-31-2006”、“09/27/1996”、“86 01 4321”等字符串。 但上述正则表达式不匹配“12/34-5678”的格式,这是因为模式“[W]”的结果“/”已经被存储,下个位置“1”引用时,其匹配模式也是字符“/”。 ②:() 这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()”把字符串组合在一起。 “()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如“abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。 ③:| 如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符 “|”。 例如: /to|too|2/ 上述正则表达式将会与目标对象中的 “to”,“too”,或 “2” 相匹配。 ④:[^] 正则表达式中还有一个较为常用的运算符,即否定符“[^]”。 与我们前文所介绍的定位符 “^” 不同,否定符“[^]”规定目标对象中不能存在模式中所规定的字符串。 例如: /[^A-C]/ 上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。 ⑤: 最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义字符“”。 例如: /Th*/ 上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。 ⑥:(?:) 当不需要存储匹配结果时使用非存储模式单元“(?:)” 例如 /(?:a|b|c)(D|E|F)1g/ 将匹配“aEEg”。 在一些正则表达式中,使用非存储模式单元是必要的,否则需要改变其后引用的顺序。上例还可以写成/(a|b|c)(C|E|F)2g/。 5:转义字符 d 包含所有数字[0-9] D 除所有数字外[^0-9] w 包含所有英文字符[a-zA-Z_0-9] W 除所有英文字符外[^a-zA-Z_0-9] s 包含空白区域如回车、换行、分页等 [fnr] a alarm,即 BEL 字符(’0) cx "control-x",其中 x 是任意字符 e escape(’0B) f 换页符 formfeed(’0C) n 换行符 newline(’0A) r 回车符 carriage return(’0D) t 制表符 tab(’0) xhh 十六进制代码为 hh 的字符 ddd 八进制代码为 ddd 的字符,或 backreference d 任一十进制数字 D 任一非十进制数的字符 A 目标的开头(独立于多行模式) Z 目标的结尾或位于结尾的换行符前(独立于多行模式) z 目标的结尾(独立于多行模式) G 目标中的第一个匹配位置 6:模式修正符 i 匹配时忽略大小写,可同时匹配大小写字母; m 将字符串视为多行,当设定了此修正符,行起始(^)和行结束($)除了匹配整个字符串开头和结束外,还分别匹配其中的换行符(n)的之后和之前; s 将字符串视为单行,换行符做普通字符看待,使“.”匹配任何字符; x 模式中的空白忽略不计 U 匹配到最近的字符串, 禁止贪婪匹配,只跟踪到最近的一个匹配符并结束,常用在采集程序上的正则表达式; U 模式字符串被当成UTF-8; e 将替换的字符串作为表达使用,只有preg_replace() 使用此修正符,其它 PCRE 函数将忽略之; A 如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配; D 如果设定了此修正符,模式中的行结束($)仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,也会被匹配在里面,如果设定了 m 修正符则忽略此选项; 7:运算顺序 运算规则:从左→到右 优先级: ()( ) 圆括号因为是内存处理所以最高; * ? + { } 重复匹配内容其次; ^ $ b 边界处理第三; | 条件处理第四; 最后按照运算顺序计算匹配。
字符 含义
i (PCRE_CASELESS)
正向预查:(?=) 相对应的 (?!)表示否定意思 反向预查:(?<=) 相对应的 (?<!)表示否定意思 前后紧跟字符 ? $regex = '/(?<=c)d(?=e)/'; /* d 前面紧跟c,d 后面紧跟e*/ $str = 'abcdefgk'; $matches = array(); if(preg_match($regex,$str,$matches)){ var_dump($matches); } echo "n"; 否定意义: ? $regex = '/(?<!c)d(?!e)/'; /* d 前面不紧跟c,d 后面不紧跟e*/ $str = 'abcdefgk'; $matches = array(); if(preg_match($regex,$matches)){ var_dump($matches); } echo "n"; >字符宽度:零 验证零字符代码 ? $regex = '/HE(?=L)LO/i'; $str = 'HELLO'; $matches = array(); if(preg_match($regex,$matches)){ var_dump($matches); } echo "n"; 打印不出结果! ? $regex = '/HE(?=L)LLO/i'; $str = 'HELLO'; $matches = array(); if(preg_match($regex,$matches)){ var_dump($matches); } echo "n"; 能打印出结果! 说明:(?=L)意思是HE后面紧跟一个L字符。但是(?=L)本身不占字符,要与(L)区分,(L)本身占一个字符。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |