用户名:  密码:   
您当前的位置:首页 > 网页设计 >  PHP > 

第6讲 正则表达式起源,语法规则,及POSIX函数ereg[i] ,ereg[i]_replace,split[i],和PCRE函数preg_grep,preg_match[_all],preg_quote,preg_replace,preg_replace_callback,preg_split

上次修改时间: 2018-07-12 15:20:45      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\PHP相关\      下一页

正则表达式起源,语法规则,及POSIX函数ereg[i] ,ereg[i]_replace,split[i],和PCRE函数preg_grep,preg_match[_all],preg_quote,preg_replace,preg_replace_callback,preg_split

6.1 什么是正则表达式
1) 定义:它是一种描述字符串结构的语法,主要用来匹配,替换,截取字符串,如windows下用*号表任意多个字符,?号表任一一个字符
例:dir *.txt
2) grep/egrep/posix区别:
 grep最最初为ed编辑器显示文件特定内容的一命令,后来成为独立工具grep
 egrep是grep的升级后版本,增强了正则表达式能力
 posix(Portable Operating System Interface可移值操作系统)其它程序员开发的用以确保操作系统间移值性的一系统标准
 类似sql标准,并非最终标准只作一个参考
3) Perl,POSIX后的另一个标准,从Perl1-5,全称实际抽取与汇报语言(PracticalExtraction and Reporting Language)
4) PCRE库:兼容Perl的正则表达式引擎,程序员可将该引擎整合到自己的语言中以支持正则功能,PHP就整合了PCRE

6.2 正则表达式语法规则
1) 正则表达式由元字符与文本字符两部分构成,元字符是指有特定含义的字符,如:*和?,文本字符是指普通文本,一般的字母和数字都是文本字符
注:PCRE的正则表达式都一般都放在定界符 / 中间
2) 行定义符  ^表行首, $表行尾。
3) 单词定界\b与\B 例1:\btm\b 表要查找的字串tm为一个完整的单词。 例2:\Btm\B 表要查找的tm字串为其它单词或字串的一部分
4) 字符类[ ], 如要匹配不分大小写的字串tm,而每个方括号只能匹配一个字符,所以写法为:[Tt][Mm] ,
5) 选择字符|  ,可理解为或,匹配不分大小写的字串tm也可以写为:(T|t)(M|m)
6) 连字符-  :表字符的范围[a-zA-Z]
7) 排除字符[^ ]:字符^在外面表行首,放在方括号中表排除,如:[^a-zA-Z_] //表匹配不能大小写字母和下划开线开头的变量名
8) 限定符?,+,*,{n},{n,},{n,m}
 ?匹配前面的字符零次或一次 ,
 +匹配前面的字符一次或多次,
 *匹配前面的字符零次或多次,
 {n}匹配前面的字符n次 
 {n,}匹配前面的字符最少n次
 {n,m}匹配前面的字符最少n次,最多m次
9) 点号字符.   用以匹配除换行字符外的任意一个字符,例:^s.t$  //匹配行首以s开头,行尾以t结尾,中间只有一个字母的单词
10) 转义字符\ 与PHP类似,用以把正则式中有特定意义的限定符转成普通字符用以搜索或匹配,如要搜点号.问号?星号*等就必须先转义
11) 反斜线\ 除用作转义字符外,还用以将一些不可打印的字符显示出来,还可指定义预定义字符集,定义断言
12) 括号字符():
作用1:用以改变限定符的作用范围 ,例:(thir|four)th,//加括号表搜索thirth或fourth,不加表搜thir或fourth
作用2:用来分组,加入子表达式,例:(\.[0-9]{1,3}){3},//匹配IP地址,这里括号里面就是子表达式
 13) 反向引用  捕获  断言(环视)  模式修饰符 略

6.3 POSIX扩展正则表达式函数 ereg[i]() ,ereg[i]_replace(),split[i]()
1) ereg()和ergei()函数,在字串中查找是否有匹配表达式的字串,并选择是否返回到数组
语法:bool erge/ergei ( string pattern, string string [, array regs]  例:
//在字符串string中匹配表达式pattern,成功返回true,否则返回false,ereg区分大小写,eregi不区分
//参数pattern和参数string为字串,可选参数regs为数组
//有可选参数regs时,匹配成功后要按子串划分存到regs数组
例:使用eregi()函数验证合法变量
 $ereg = '^[$][[:alpha:]_][[:alnum:]]*';  //声明变量,把正则表达式赋值给它
 ereg($ereg,'$_name',$register);
 var_dump($register);  //查php中文手册得为输入表达式的结构信息
 
2) ereg_replace()和eregi_replace()函数  用以将字符串匹配表达式的字串替换成另一字串
语法:string ereg_replace/eregi_replace(string pattern, string replacement, string string)
//在string中匹配pattern,将匹配的字串替换成replacement,输出替换后的string。eregi_replace不区分大小写
 $ereg = '(tm)';  //声明变量并将正则表达式赋值给它
 $str = 'hello,tm,Tm,tM.';  //声明一个变量赋给一个字串
 $rep_str = eregi_replace("(tm)","\$0",$str);  //使用不区分大小写函数替换
 echo $rep_str;

3)split()和spliti()函数, 在字串按匹配表达式的位置分割字符串成N段,选择是否返回到数组,有i的不区分大小写
array split/spliti(string pattern, string string [,int limit])
//用表达式pattern分割字串string,函数错误返回false
//有可选参数limit时,返回最多limit个元素,剩余部分都写到最后一个数组中,
 $ereg = 'is';
 $str = 'This is a register book.';
 $arr_str = spliti($ereg.$str);
 var_dump($arr_str);

6.4 兼容正则表达式的PCRE函数(优于POSIX),
主要函数:preg_grep(),preg_match[_all](),preg_quote(),preg_replace(),preg_replace_callback(),preg_split()
1)preg_grep()函数  在数组中查找匹配表达式的元素有那些,选择是否返回它们
语法:array preg_grep(string pattern,array input)
//用表达式pattern去匹配数组input中的每个元素,把所有匹配的元素组成一个数组返回
 $preg = '/'d{3,4}-?\d{7,8}/';
 $arr = array('043212345678','0431-7654321','12345678');
 $preg_arr = preg_grep($preg,$arr);
 var_dump($preg_arr);
2)preg_match()和preg_match_all()函数,在字串中查找匹配表达的字串有多少个,再返回匹配的到数组
语法:int preg_match/preg_match_all(string pattern, string subject [,array matches])
//返回字串subject中匹配表达式pattern的次数,如有可选参数matches,把每次匹配结果都存到matches数组中
//preg_match()函数返回0或1,只要找到就停止再找,而preg_match_all()函数会一直查找,它必须要有matches参数
 $str = 'This is an example!';
 $preg = '/\b\w{2}\b/';
 $num1 = preg_match($preg,$str,$str1);
 echo $num1.'<br>';
 var_dump($str1);
 $num2 = preg_match_all($preg,$str,$str2);
 echo '<br>'.$num2.'<br>';
 var_dump($str2);
3)preg_quote()函数,转义用的,将正则式有实际意义的元字符转义,无实际意义不转义,如@和#等
语法: string preg_quote(string str [,string delimiter])
//将字符串str中的元字符自动转义,如有可选参数,那么可选参数有delimiter所代表的字串也被转义
 $str = '!、$、^、*、+、.、[、]、\\、/、b、<、>';
 $str2='b';
 $match_one = preg_quote($str,$str2);
 echo $match_one;
4)preg_replace()函数 将匹配表达的字串替换成另一字串
语法:mixed preg_replace(mixed pattern, mixed replacement, mixed subject [, int limit])
//将字串subject中匹配表达式pattern的字串替换成字串replacement,可选参数limit表替换limit次
 $string = '[b]粗体字[/b]';
 $b_rst = preg_replace('/\[b\](.*)\[\/b\]/i','<b>$1</b>',$string);
 echo $b_rst;
5)preg_replace_callback()函数 功能同的的preg_replace()函数,只是这里使用了回调函数callback代替replacement
语法:mixed preg_replace_callback(mixed pattern, callback callback,mixed subject [, int limit])
 function c_back($str) {
  $str = '<font color=$str[1]>$str[2]</font>";
  return $str;
 }
 $string = '[color=blue]字体颜色[/color]';
 echo preg_replace_callback('/\[color=(.*)\](.*)\[/color\]/i',"c_back",$string);
6) preg_split()函数,功能同ereg_split()函数
语法:array preg_split(string pattern, string subject [,int limit])
//用表达式pattern来分割字串subject,用法与ereg_split()函数相同