php 正则 笔记以 及反向引用的实践

来源:互联网 发布:淘宝运费模板在哪设置 编辑:程序博客网 时间:2024/06/06 03:40
$regex = '/<(a|p|span|label|img)[\w\s"=:\.\/]+>(.*)<\/\1>/isU';//注意这句\1为反向引用    $str = '<img href="http://Baidu.com">百度</img> 百度';$matches = array(); if(preg_match($regex, $str, $matches)){    var_dump($matches);}
当我们使用 preg_match 匹配时 \1可以反向引用的到。但是看下面例子 


header("Content-type:text/html;charset=utf-8");$regex = '/<(a|p|span|label|img)([\w\s"=:\.\/]+)>(.*)<\/\1>/isU';    $str = '<a href="http://baidu.com">百度</a>';$matches = array(); echo preg_replace('/<(a|p|span|label|img)([\w\s"=:\.\/]+)>(.*)<\/\1>/i',"[\$1\$2]\$3[/\$1]" ,$str);
在这个例子里面就需要使用\$1来反向匹配前面的内容了。知道的说一下



正则匹配主要是  

① 一种是“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 边界处理第三; 
|  条件处理第四;  
最后按照运算顺序计算匹配。
0 0
原创粉丝点击