background image

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)

” “

” “

一般被翻译成 反向引用 、 后向引用 、 向后引用 ,个人

觉得 回返引用 更为贴切[笨活儿]。它是在正则表达式内部引用之前捕获到的内容的方法。
例如,下面这个简单例子的目的是匹配出引号内部的内容:

# 建立匹配数组