( ! ) Warning: include(): http:// wrapper is disabled in the server configuration by allow_url_include=0 in D:\www\up\php\php_regex.php on line 20
Call Stack
#TimeMemoryFunctionLocation
10.0000378000{main}( )...\php_regex.php:0

( ! ) Warning: include(http://pub.houheaven.com/Nav02/Nav_deep2.htm): failed to open stream: no suitable wrapper could be found in D:\www\up\php\php_regex.php on line 20
Call Stack
#TimeMemoryFunctionLocation
10.0000378000{main}( )...\php_regex.php:0

( ! ) Warning: include(): Failed opening 'http://pub.houheaven.com/Nav02/Nav_deep2.htm' for inclusion (include_path='.;C:\php\pear') in D:\www\up\php\php_regex.php on line 20
Call Stack
#TimeMemoryFunctionLocation
10.0000378000{main}( )...\php_regex.php:0

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

正则表达式的主要作用:对指定字符串进行匹配、分割、查找、替换。


正则函数

[ 官方正则函数详细讲解 ]

①. preg_match()

语法:preg_match(RegEx,String,Array,Flag,Offset)

参数:RegEx - 正则语法,要求有一对相同的开始和结束标识,可以是 @ | # / 等。

String - 正则内容,必选参数,要匹配的字符串。

Array - 正则结果,将匹配到的结果保存到数组中,默认是一维数组。

Flag - 正则标识,默认是 0,不显示匹配结果的偏移量,PREG_OFFSET_CAPTURE 显示。

说明:此函数在成功匹配到第一个结果后会停止匹配,只匹配一次。

返回:返回匹配到的个数。


②. preg_match_all()

语法:preg_match(RegEx,String,Array,Flag,Offset)

参数:Array - 正则结果,将匹配到的结果保存到数组中,默认是二维数组。

Flag - 正则标识,PREG_OFFSET_CAPTURE、PREG_SET_ORDER、PREG_PATTERN_ORDER。

说明:此函数在成功匹配到第一个结果后会继续匹配,匹配多次。

返回:返回匹配到的个数。


③. preg_replace()

语法:preg_replace(RegEx,Replace,String,Limit,Count)

参数:RegEx - 正则规则,可以是字符串或者数组。

Replace - 替换规则,可以是字符串、数组、运算函数。

String - 替换内容,要进行搜索和替换的字符串或字符串数组。

Limit - 替换限制,限制替换的次数。

Count - 替换次数,默认为 -1,无限次,将替换的次数保存到一个变量中。

返回:取决于 String 类型。


④. preg_split()

语法:preg_split(RegEx,String,Limit,Flag)

参数:RegEx - 正则规则,可以是字符串或者数组。

String - 分割内容,要进行搜索和分割的字符串。

Limit - 分割限制,限制分割的次数。

Flag - 分割标识。

返回:返回一个数组。


正则表达式元素

①. 原子

普通字符:最常见的字符,如 a-z A-Z 0-9 _

单元字符:普通字符组成的字符集合,用一堆小括号括起来,作为一个整体去匹配,如 (movie),它的规则是在指定字符串中只有出现了 movie 这个字符集合,才会正常匹配到,如果字符串中出现了 movi、mov、vie 等等,都不能正常匹配到。

原子表:用方括号括起来的字符集合,如 [houheaven]、[^houheaven],前者它的规则是在指定字符串中出现了 houheaven 这个字符集合中的任意一部分,正则都能正常匹配到,如 hou、heaven、hea 等等;后者的意思正好相反,字符串中不能出现这些字符才能正常匹配到。

转义字符:表示特殊的字符

转义字符说明表示内容
\b包含所有数字[0-9]
\B排除所有数字[^0-9]
\w包含所有普通字符[a-zA-Z0-9_]
\W排除所有普通字符[^a-zA-Z0-9_]
\s包含空白区域(空格、回车、换行、分页、水平制表符、垂直制表符)[\n\r\f\t\v]
\S排除空白区域(空格、回车、换行、分页、水平制表符、垂直制表符)[^\n\r\f\t\v]

②. 元字符

元字符说明实例
.匹配当前字符1次,但不包括回车换行等实例
        
        // 说明1:# 表示正则表达式的开始和结束标识,不可省略,可以使用 / @ # 等
        // 说明2:. 表示了任意可显示字符(回车 \n 等转义字符除外),只能出现一次
        
        $reg="#go.gle#";
        $str1="gogle";
        $str2="google";
        $str3="gooogle";
        $str4="goxgle";
        $str5="go*gle";
        echo preg_match($reg,$str1,$arr);	// 0,指定字符出现0次,匹配失败
        echo preg_match($reg,$str2,$arr);	// 1,指定字符出现1次,匹配成功
        echo preg_match($reg,$str3,$arr);	// 0,指定字符出现2次,匹配失败
        echo preg_match($reg,$str4,$arr);	// 1,指定字符属于合法字符,匹配成功
        echo preg_match($reg,$str5,$arr);	// 1,指定字符属于合法字符,匹配成功
        
*匹配前一个字符内容的0次、1次或多次实例
        
        $reg="#go*gle#";
        $str1="ggle";
        $str2="gogle";
        $str3="google";
        $str4="gooooooogle";
        $str5="goxgle";
        echo preg_match($reg,$str1,$arr);	// 1,指定字符出现0次,匹配成功
        echo preg_match($reg,$str2,$arr);	// 1,指定字符出现1次,匹配成功
        echo preg_match($reg,$str3,$arr);	// 1,指定字符出现2次,匹配成功
        echo preg_match($reg,$str4,$arr);	// 1,指定字符出现多次,匹配成功
        echo preg_match($reg,$str5,$arr);	// 0,指定字符不符合正则规则,匹配失败
        
+匹配前一个字符内容的1次或多次实例
        
        $reg="#go+gle#";
        $str1="ggle";
        $str2="gogle";
        $str3="google";
        $str4="gooooooogle";
        $str5="goxgle";
        echo preg_match($reg,$str1,$arr);	// 0,指定字符出现0次,匹配失败
        echo preg_match($reg,$str2,$arr);	// 1,指定字符出现1次,匹配成功
        echo preg_match($reg,$str3,$arr);	// 1,指定字符出现2次,匹配成功
        echo preg_match($reg,$str4,$arr);	// 1,指定字符出现多次,匹配成功
        echo preg_match($reg,$str5,$arr);	// 0,指定字符不符合正则规则,匹配失败
        
?匹配前一个字符内容的0次或1次实例
        
        $reg="#go?gle#";
        $str1="ggle";
        $str2="gogle";
        $str3="google";
        $str4="gooooooogle";
        $str5="goxgle";
        echo preg_match($reg,$str1,$arr);	// 1,指定字符出现0次,匹配成功
        echo preg_match($reg,$str2,$arr);	// 1,指定字符出现1次,匹配成功
        echo preg_match($reg,$str3,$arr);	// 0,指定字符出现2次,匹配失败
        echo preg_match($reg,$str4,$arr);	// 0,指定字符出现多次,匹配失败
        echo preg_match($reg,$str5,$arr);	// 0,指定字符不符合正则规则,匹配失败
        
{M}匹配前一个字符内容的重复次数为 M次(t=M)实例
        
        $reg="#go{0}gle#";
        $str1="ggle";
        $str2="gogle";
        $str3="google";
        $str4="gooooooogle";
        $str5="goxgle";
        echo preg_match($reg,$str1,$arr);	// 1,指定字符出现0次,匹配成功
        echo preg_match($reg,$str2,$arr);	// 0,指定字符出现1次,匹配失败
        echo preg_match($reg,$str3,$arr);	// 0,指定字符出现2次,匹配失败
        echo preg_match($reg,$str4,$arr);	// 0,指定字符出现多次,匹配失败
        echo preg_match($reg,$str5,$arr);	// 0,指定字符不符合正则规则,匹配失败
        
{M,}匹配前一个字符内容的重复次数为 大于或等于M次(t≥M)实例
        
        $reg="#go{1,}gle#";
        $str1="ggle";
        $str2="gogle";
        $str3="google";
        $str4="gooooooogle";
        $str5="goxgle";
        echo preg_match($reg,$str1,$arr);	// 0,指定字符出现0次,匹配失败
        echo preg_match($reg,$str2,$arr);	// 1,指定字符出现1次,匹配成功
        echo preg_match($reg,$str3,$arr);	// 1,指定字符出现2次,匹配成功
        echo preg_match($reg,$str4,$arr);	// 1,指定字符出现多次,匹配成功
        echo preg_match($reg,$str5,$arr);	// 0,指定字符不符合正则规则,匹配失败
        
{M,N}匹配前一个字符内容的重复次数为 M到N次(M≤t≤N)实例
        
        $reg="#go{0,2}gle#";
        $str1="ggle";
        $str2="gogle";
        $str3="google";
        $str4="gooooooogle";
        $str5="goxgle";
        echo preg_match($reg,$str1,$arr);	// 1,指定字符出现0次,匹配成功
        echo preg_match($reg,$str2,$arr);	// 1,指定字符出现1次,匹配成功
        echo preg_match($reg,$str3,$arr);	// 1,指定字符出现2次,匹配成功
        echo preg_match($reg,$str4,$arr);	// 0,指定字符出现多次,匹配失败
        echo preg_match($reg,$str5,$arr);	// 0,指定字符不符合正则规则,匹配失败
        
()合并整体匹配,并放入内存,使用 \1 \2 ……依次读取实例
        
        $reg="#2000(.*)01\\1(01)#";		// (01) 代表着日期数字,不括起来会干扰 \\1
        $str1="2000-01-01";
        $str2="2000/01/01";
        $str3="2000-01/01";
        echo preg_match($reg,$str1,$arr);	// 1,前后分割字符是相同的,匹配成功
        echo preg_match($reg,$str2,$arr);	// 1,前后分割字符是相同的,匹配成功
        echo preg_match($reg,$str3,$arr);	// 0,前后分割字符是不同的,匹配失败
        
|选择匹配实例
        
        $reg="#google|baidu#";
        $str1="google";
        $str2="baidu";
        $str3="baidugoogle";
        $str4="googlebaidu";
        $str5="googletempbaidu";
        echo preg_match($reg,$str1,$arr);	// 1,包含正则内容,匹配成功
        echo preg_match($reg,$str2,$arr);	// 1,包含正则内容,匹配成功
        echo preg_match($reg,$str3,$arr);	// 1,包含正则内容,匹配成功
        echo preg_match($reg,$str4,$arr);	// 1,包含正则内容,匹配成功
        echo preg_match($reg,$str5,$arr);	// 1,包含正则内容,匹配成功
        
^匹配字符串首部内容实例
        
        $reg="#^music#";
        $str1="music_movie_image";
        $str2="movie_music_image";
        $str3="movie_image_music";
        echo preg_match($reg,$str1,$arr);	// 1,匹配字符出现在最前面,匹配成功
        echo preg_match($reg,$str2,$arr);	// 0,匹配字符没有出现在最前面,匹配失败
        echo preg_match($reg,$str3,$arr);	// 0,匹配字符没有出现在最前面,匹配失败
        
$匹配字符串尾部内容实例
        
        $reg="#music$#";
        $str1="music_movie_image";
        $str2="movie_music_image";
        $str3="movie_image_music";
        echo preg_match($reg,$str1,$arr);	// 0,匹配字符出现在最后面,匹配失败
        echo preg_match($reg,$str2,$arr);	// 0,匹配字符没有出现在最后面,匹配失败
        echo preg_match($reg,$str3,$arr);	// 1,匹配字符没有出现在最后面,匹配成功
        
\b匹配单词边界,边界可以是空格或特殊字符实例
        
        $reg="#\bam\b#";
        $str1="I am sorry";
        $str2="I#am#sorry";
        $str3="I@am@sorry";
        $str4="I_am_sorry";
        $str5="Iamsorry";
        echo preg_match($reg,$str1,$arr);	// 1,边界符号是空格,匹配成功
        echo preg_match($reg,$str2,$arr);	// 1,边界符号是#,匹配成功
        echo preg_match($reg,$str3,$arr);	// 1,边界符号是@,匹配成功
        echo preg_match($reg,$str4,$arr);	// 0,边界符号不能是_,匹配失败
        echo preg_match($reg,$str5,$arr);	// 0,边界符号不能是英文字母,匹配失败
        
\B匹配除单词边界以外的内容实例
        
        $reg="#\bam\b#";
        $str1="I am sorry";
        $str2="I#am#sorry";
        $str3="I@am@sorry";
        $str4="I_am_sorry";
        $str5="Iamsorry";
        echo preg_match($reg,$str1,$arr);	// 0,匹配失败
        echo preg_match($reg,$str2,$arr);	// 0,匹配失败
        echo preg_match($reg,$str3,$arr);	// 0,匹配失败
        echo preg_match($reg,$str4,$arr);	// 1,匹配成功
        echo preg_match($reg,$str5,$arr);	// 1,匹配成功
        

③. 模式修正符

模式修正符是为正则表达式增强和补充的一个功能,使用时把模式修正符放在整个正则表达式的后面。

模式修正符说明实例
i正则内容在匹配的时候不区分大小写实例
        
        $reg1="#google#";
        $reg2="#google#i";
        $str1="google";
        $str2="GOOGLE";
        echo preg_match($reg1,$str1,$arr);	// 1,匹配成功
        echo preg_match($reg1,$str2,$arr);	// 0,匹配失败
        echo preg_match($reg2,$str1,$arr);	// 1,匹配成功
        echo preg_match($reg2,$str2,$arr);	// 1,匹配成功
        
m匹配首内容或者尾内容时 采用多行识别匹配实例
        
        $reg1="#.com$#";
        $reg2="#.com$#m";
        $str1="google.com\nbaidu.com";		// \n 是一个换行,将一行字符串变成两行
        echo preg_match_all($reg1,$str1,$arr1);		// 1,匹配到 1 个
        echo preg_match_all($reg2,$str1,$arr2);		// 2,匹配到 2 个
        
s将字符串中的回车转义字符取消,进行单行匹配实例
        
        $reg1="#2013(.*)coming#";
        $reg2="#2013(.*)coming#s";
        $str="2013 pass \n 2014 coming";
        echo preg_match_all($reg1,$str,$arr1);		// 0,匹配失败
        echo preg_match_all($reg2,$str,$arr2);		// 1,匹配成功
        
x忽略正则中的空白实例
        
        $reg1="#2000(.*)01\\1 01#";
        $reg2="#2000(.*)01\\1 01#x";
        $str="2000-01-01";
        echo preg_match($reg1,$str,$arr1);	// 0,匹配失败
        echo preg_match($reg2,$str,$arr2);	// 1,匹配成功
        
e在执行正则替换函数的时候,使其他函数先运算后替换实例
        
        $regex=array("#website#","#website#e","#\n#");
        $replc=array("'www.baidu.com ( MD5:'.md5(\"www.baidu.com\").' )'"
                    ,"'www.google.com ( MD5:'.md5(\"www.google.com\").' )'"
                    ,"<br>;");
        $str="web1:website\nweb2:website";
        
        echo preg_replace($regex,$replc,$str,1,$count);
        echo $count;
        
        // web1:'www.baidu.com ( MD5:'.md5("www.baidu.com").' )'
        // web2:www.google.com ( MD5:0a137b375cc3881a70e186ce2172c8d1 )
        // 3,因为数组有三部分,每部分替换一次,替换三次
        
A强制 ^ 匹配从头开始匹配实例
        
        $reg="#^www#mA";
        $str1="map_baidu_com\nwww_google_com";
        $str2=" www_baidu_com\nwww_google_com";
        $str3="www_baidu_com\nwww_google_com";
        echo preg_match_all($reg,$str1,$arr1);	// 0,www 必须在第一行,第二行不行
        echo preg_match_all($reg,$str2,$arr2);	// 0,www 前面不能有 空格、回车、换行 等
        echo preg_match_all($reg,$str3,$arr3);	// 1,完全复合正则要求
        
D强制 $ 匹配尾部无任何空白不显示字符内容实例
        
        $reg="#baidu$#D";	// 要求匹配内容最后不能有 空格、回车、换行 等
        $str1="baidu";
        $str2="baidu ";
        $str3="baidu\n";
        $str4="baidu\r";
        $str5="baidu\t";
        echo preg_match($reg,$str1,$arr1);	// 1,匹配成功
        echo preg_match($reg,$str2,$arr2);	// 0,匹配失败
        echo preg_match($reg,$str3,$arr3);	// 0,匹配失败
        echo preg_match($reg,$str4,$arr4);	// 0,匹配失败
        echo preg_match($reg,$str5,$arr5);	// 0,匹配失败
        
U禁止贪婪匹配,只跟踪到最近的一个匹配符并结束实例
        
        $reg1="#<(.*)>#";
        $reg2="#<(.*)>#U";
        $str="<b>web tag</b>";
        echo preg_match($reg1,$str,$arr1);	// 1,匹配内容:<b>web tag</b>
        echo preg_match($reg2,$str,$arr2);	// 1,匹配内容:<b>
        
显示框架
显示框架
显示框架
显示框架