php正则表达式高级技巧及实例(Perl兼容)
正则表达式(Regular Expression, abbr. regex) 功能强大,能够用于在一大串字符里找到所需信息。它利用约定俗成的字符结构表达式来发生作用。不幸的是,简单的正则表达式对于一些高级运用,功能远远不够。若要进行筛选的结构比较复杂,你可能就需要用到高级正则表达式。 本文为您介绍正则表达式的高级技巧。我们筛选出了八个常用的概念,并配上实例解析,每个例子都是满足 某种复杂要求的简单写法。如果你对正则的基本概念尚缺乏了解,请先阅读这篇文章,或者这个教程,或者维基条目。 这里的正则语法适用于PHP,与Perl兼容。 1. 贪婪/懒惰 所有能多次限定的正则运算符都是贪婪的。他们尽可能多地匹配目标字 符串,也就是说匹配结果会尽可能地长。不幸的是,这种做法并不总是我们想要的。因此,我们添加“懒惰”限定符来解决问题。 在各个贪婪运算符后添加“?”能让表达式只匹配尽可能短的长度。另外,修改器“U”也能惰化能多次限定的运算符。 理解贪婪与懒惰的区别是运用高级正则表达式的基础。 贪婪操作符 操作符 * 匹配之前的表达式零次或零次以上。它是 一个贪婪操作符。请看下面的例子: preg_match( ''/<h1>.*<\/h1>/'', ''<h1>这是一个标题。 </h1> <h1>这是另一个。</h1>'', $matches ); 句点(.)能代表除换行符外的任意字符。上面 的正则表达式匹配 h1 标签以及标签内的所有内容。它用句点(.)和星号(*)来匹配标签内的所有内容。匹配结果如下: <h1> 这是一个标题。</h1><h1>这是另一个。</h1> 整个字串都被返回。* 操作符会连续匹配所有内容 —— 甚至包括中间的 h1 闭合标签。因为它是贪婪的,匹配整个字串是符合其利益最大化原则。 懒惰操作符 把上面的式子稍作修改,加上一个问号(?),能让表达式变懒惰: /<h1>.*?<\/h1>/ 这样它会觉得,只需匹配到第一个 h1 结尾标签就完成任务了。 另一个有着类似属性的贪婪操作符是 {n,} 。它代表之前的匹配模式重复n次或n次以上,如果没有加上问号,它会寻找尽可能多的重复次数,加上的话,则会尽可能少重复(当然也就是“重复n次”最少)。 # 建立字串 $str = ''hihihi oops hi''; # 使用贪婪的{n,}操作符进行匹配 preg_match( ''/(hi){2,}/'', $str, $matches ); # matches[0] 将是 ''hihihi'' # 使用堕化了的 {n,}? 操作符匹配 preg_match( ''/(hi){2,}?/'', $str, $matches ); # matches[0] 将是 ''hihi'' 2. 回返引用(Back referencing) 有什么用? 回返引用(Back referencing)一般被翻译成“反向引用”、“后向引用”、“向后引用”,个人觉得“回返引用”更为贴切[笨活儿]。它是在正则表达式内部引用之前捕获到的内容的方法。例如,下面这个简单例子的目的是匹配出引号内部的内容: # 建立匹配数组 $matches = array(); # 建立字串 $str = ""This is a ''string''""; # 用正则表达式捕捉内容 preg_match( "/(\"|'').*?(\"|'')/", $str, $matches ); # 输出整个匹配字串 echo $matches[0]; 它会输出: "This is a'' 显然,这并不是我们想要的内容。 这个表达式从开头的双引号开始匹配,遭遇单引号之后就错误地结束了匹配。这是因为表达式里说:("|''),也就是双引号(")和单引号('')均可。要修正这个问题,你可以用到回返引用。表达式\1,\2,…,\9 是对前面已捕获到的各个子内容的编组序号,能作为对这些编组的“指针”而被引用。在此例中,第一个被匹配的引号就由\1代表。 如何运用? 将上面的例子中,后面的 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |