正则表达式

来源:互联网 发布:js 数组拼接去重 编辑:程序博客网 时间:2024/06/05 20:40

概述:
正则匹配主要是  
① 一种是“preg_”为前缀命名的函数,
② 一种是以“ereg_”为前缀命名的函数,
但是ereg_这类的函数不推荐使用,PHP6以后就移除了,使用preg_这类函数的时候,记得开始和结束定界符(// or ||)

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键和换行符,等价于[\f\t\v]; 
\S: 用于匹配除单个空格符之外的任何一个字符,[^\f\t\v]; 
\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}\\1\d{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    包含空白区域如回车、换行、分页等 [\f\n\r] 
\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 边界处理第三; 
|  条件处理第四;  

最后按照运算顺序计算匹配。


字符  含义 
\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。


i (PCRE_CASELESS)
如果设定此修正符,模式中的字符将同时匹配大小写字母。 


m(PCRE_MULTILINE)
默认情况下,PCRE 将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符(^)仅仅匹配字符串的起始,“行结束”元字符($)仅 仅匹配字符串的结束,或者最后一个字符是换行符时其前面(除非设定了 D 修正符)。这和 Perl 是一样的。 


当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl 的 /m 修正符是等效的。如果目标字符串中没有“/n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。 


s(PCRE_DOTALL)
如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。 


x(PCRE_EXTENDED)
如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两头,也都被忽略。这和 Perl 的 /x 修正符是等效的,使得可以在复杂的模式中加入注释。然而注意,这仅适用于数据字符。空白字符可能永远不会出现于模式中的特殊字符序列,例如引入条件子模式 的序列 (?( 中间。 


e
如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。 


只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。 


注: 本修正符在 PHP3 中不可用。 




A(PCRE_ANCHORED)
如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。此效果也可以通过适当的模式本身来实现(在 Perl 中实现的唯一方法)。 


D(PCRE_DOLLAR_ENDONLY)
如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前(但不会匹配任何其它换行符之前)。如果设定了 m 修正符则忽略此选项。Perl 中没有与其等价的修正符。 


S
当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。 


U(PCRE_UNGREEDY)
本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (?U) 修正符或者在数量符之后跟一个问号(如 .*?)来启用此选项。 


X(PCRE_EXTRA)
此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,和 Perl 一样,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。当前没有其它特性受此修正符控制。 


u(PCRE_UTF8)
此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起开始检查模式的 UTF-8 合法性。


正向预查:(?=) 相对应的 (?!)表示否定意思
反向预查:(?<=) 相对应的 (?<!)表示否定意思
前后紧跟字符
?
$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, $str, $matches)){ 
    var_dump($matches); 

  
echo "\n"; 
 




>字符宽度:零
验证零字符代码
?
$regex = '/HE(?=L)LO/i'; 
$str = 'HELLO'; 
$matches = array(); 
  
if(preg_match($regex, $str, $matches)){ 
    var_dump($matches); 

  
echo "\n"; 
打印不出结果!


?
$regex = '/HE(?=L)LLO/i'; 
$str = 'HELLO'; 
$matches = array(); 
  
if(preg_match($regex, $str, $matches)){ 
    var_dump($matches); 

  
echo "\n"; 
 能打印出结果!


说明:(?=L)意思是HE后面紧跟一个L字符。但是(?=L)本身不占字符,要与(L)区分,(L)本身占一个字符。


0 0
原创粉丝点击