加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php正则表达式用法的详细介绍

发布时间:2022-07-11 16:22:50 所属栏目:PHP教程 来源:互联网
导读:前言 正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真去阅读这些资料,加上应用的时候进行一定的参考,掌握正则表达式不是问题。 1. 引子 目前,正则表达式已经在很多软件中得到广泛的应用,包括*
  前言
 
  正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真去阅读这些资料,加上应用的时候进行一定的参考,掌握正则表达式不是问题。
 
 
  1. 引子
 
    目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。
 
    正则表达式的使用,可以通过简单的办法来实现强大的功能。为了简单有效而又不失强大,造成了正则表达式代码的难度较大,学习起来也不是很容易,所以需要付出一些努力才行,入门之后参照一定的参考,使用起来还是比较简单有效的。
 
  例子: ^.+@.+//..+$
 
    这样的代码曾经多次把我自己给吓退过。可能很多人也是被这样的代码给吓跑的吧。继续阅读本文将让你也可以自由应用这样的代码。
 
    注意:这里的第7部分跟前面的内容看起来似乎有些重复,目的是把前面表格里的部分重新描述了一次,目的是让这些内容更容易理解。
 
  2. 正则表达历史
    正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。
 
    1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。
 
    随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。
 
    如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。
 
 
  3. 正则表达式定义
 
    正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
 
  列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的。
 
    正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
  3.1 字符
 
  1、普通字符:
 
  由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。
 
  2、非打印字符:
  字符 含义
  /cx 匹配由x指明的控制字符。例如, /cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
  /f 匹配一个换页符。等价于 /x0c 和 /cL。
  /n 匹配一个换行符。等价于 /x0a 和 /cJ。
  /r 匹配一个回车符。等价于 /x0d 和 /cM。
  /s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ /f/n/r/t/v]。
  /S 匹配任何非空白字符。等价于 [^ /f/n/r/t/v]。
  /t 匹配一个制表符。等价于 /x09 和 /cI。
  /v 匹配一个垂直制表符。等价于 /x0b 和 /cK。
 
 
  3、元字符(特殊字符):
 
     所谓元字符(特殊字符),就是一些有特殊含义的字符,如上面说的"*.txt"中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个/。ls /*.txt。正则表达式有以下特殊字符。
 
  要在正则表达式模式中包含元字符以使其不具有特殊含义,您必须使用反斜杠 (/) 转义字符。例如,下面的正则表达式与顺序依次为字母 A、字母 B、星号和字母 C 的模式匹配:
 
  /AB/*C/;
  元字符 说明
  $ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '/n' 或 '/r'。要匹配 $ 字符本身,请使用 /$。
  ( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 /( 和 /)。
  * 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 /*。
  + 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 /+。
  . 匹配除换行符 /n之外的任何单字符。要匹配 .,请使用 /。
  [ 标记一个中括号表达式的开始。要匹配 [,请使用 /[。
  ? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 /?。
  / 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'/n' 匹配换行符。序列 '//' 匹配 "/",而 '/(' 则匹配 "("。
  ^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 /^。
  { 标记限定符表达式的开始。要匹配 {,请使用 /{。
  | 指明两项之间的一个选择。要匹配 |,请使用 /|。
 
    构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
 
  4、限定符:
 
  限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。
  *、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
     正则表达式的限定符有:
   
  字符 描述
  * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
  + 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
  ? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
  {n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
  {n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
  {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 
 
  5、定界符:边界
 
  用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,/b描述单词的前或后边界,/B表示非单词边界。不能对定位符使用限定符。
  3.2 字符类[ ]
 
  可以使用字符类指定字符列表以匹配正则表达式中的一个位置。使用方括号([ 和 ])定义字符类。例如,下面的正则表达式定义了匹配 bag、beg、big、bog 或 bug 的字符类:
  /b[aeiou]g/
  1、字符类中的转义序列:
  通常在正则表达式中具有特殊含义的大多数元字符和元序列在字符类中“不具有”那些特殊含义。例如,在正则表达式中星号用于表示重复,但是出现在字符类中时则不具有此含义。下列字符类匹配星号本身以及列出的任何其它字符:
  /[abc*123]/
  但是,下表中列出的三个字符功能与元字符相同,在字符类中具有特殊含义:
 
  ] :定义字符类的结尾。
  - :定义字符范围
 
  / :定义元序列并撤销元字符的特殊含义。
  对于要识别为字面字符(无特殊元字符含义)的任何字符,必须在该字符前面加反斜杠转义字符。 例如,下面的正则表达式包含匹配四个符号($、/、] 或 -)中任意一个符号的字符类。
  /[$///]/-]/
 
  2、字符类中字符的范围:
  使用连字符指定字符的范围,例如 A-Z、a-z 或 0-9。这些字符必须在字符类中构成有效的范围。例如,下面的字符类匹配 a-z 范围内的任何一个字符或任何数字:
  /[a-z0-9]/
  您还可以使用 /xnn ASCII 字符代码通过 ASCII 值指定范围。例如,下面的字符类匹配扩展 ASCII 字符集中的任意字符 (如 é 和 ê):
  /[/x80-/x9A]/
 
  3、反转的字符类:
  如果在字符类的开头使用尖号 (^) 字符,则将反转该集合的意义,即未列出的任何字符都认为匹配。下面的字符类匹配除小写字母 (a-z) 或数字以外的任何字符:
  /[^a-z0-9]/
  必须在字符类的“开头”键入尖号 (^) 字符以表示反转。否则,您只是将尖号字符添加到字符类的字符中。例如,下面的字符类匹配许多符号字符中的任意一个,其中包括尖号:
  /[!.,#+*%$&^]/
  3.3 分组和选择
 
     用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。
     其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。

  说明
    下面列出了当前在 PCRE 中可能使用的修正符。括号中是这些修正符的内部 PCRE 名。修正符中的空格和换行被忽略,其它字符会导致错误。
 
  i (PCRE_CASELESS)
    如果设定此修正符,模式中的字符将同时匹配大小写字母。
 
  m(PCRE_MULTILINE)
    默认情况下,PCRE 将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符(^)仅仅匹配字符串的起始,“行结束”元字符($)仅仅匹配字符串的结束,或者最后一个字符是换行符时其前面(除非设定了 D 修正符)。这和 Perl 是一样的。
 
    当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl 的 /m 修正符是等效的。如果目标字符串中没有“/n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。
 
  s(PCRE_DOTALL)
    如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。
 
  x(PCRE_EXTENDED)
    如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两头,也都被忽略。这和 Perl 的 /x 修正符是等效的,使得可以在复杂的模式中加入注释。然而注意,这仅适用于数据字符。空白字符可能永远不会出现于模式中的特殊字符序列,例如引入条件子模式的序列 (?( 中间。
 
  e
    如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。
 
    只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。
 
    注: 本修正符在 PHP3 中不可用。
 
  A(PCRE_ANCHORED)
    如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。此效果也可以通过适当的模式本身来实现(在 Perl 中实现的唯一方法)。
 
  D(PCRE_DOLLAR_ENDONLY)
    如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果  最后一个字符是换行符的话,美元符号也会匹配此字符之前(但不会匹配任何其它换行符之前)。如果设定了 m 修正符则忽略此选项。Perl 中没有与其等价的修正符。
 
  S
    当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。
 
  U(PCRE_UNGREEDY)
    本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (?U) 修正符或者在数量符之后跟一个问号(如 .*?)来启用此选项。
 
  例如:
 
  复制代码 代码如下:www.CuoXIn.com
 
  <?php
  $str = 'src="http://www.test.cn/1.mp3" type="application/x-mplayer2"test,3333';
  echo preg_replace('/src="(.*)"/', '--', $str);
  echo '<br>';
  echo preg_replace('/src="(.*)"/U', '--', $str);
  echo '<br>';
  echo preg_replace('/src="(.*?)"/', '--', $str);//等效preg_replace('|src="(.*)"|U', '--', $str);
 
  结果:
  --test,3333
 
  -- type="application/x-mplayer2"test,3333
 
  -- type="application/x-mplayer2"test,3333
 
  从这里我们就可以看出,第一个执行结果一直匹配到最后一个满足条件的字符,专业一点就叫贪婪匹配,
 
  第二个执行结果只匹配第一个满足条件的字符,叫 非贪婪匹配。
 
  X(PCRE_EXTRA)
    此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,和 Perl 一样,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。当前没有其它特性受此修正符控制。
 
  u(PCRE_UTF8)
    此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起开始检查模式的 UTF-8 合法性。
 
 
  4. 各种操作符的运算优先级
 
     相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:
   
  操作符 描述
  / 转义符
  (), (?:), (?=), [] 圆括号和方括号
  *, +, ?, {n}, {n,}, {n,m} 限定符
  ^, $, /anymetacharacter 位置和顺序
  | “或”操作
 
  5. 全部符号解释
  字符 描述
  / 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'/n' 匹配一个换行符。序列 '//' 匹配 "/" 而 "/(" 则匹配 "("。
  ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '/n' 或 '/r' 之后的位置。
  $ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '/n' 或 '/r' 之前的位置。
  * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
  + 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
  ? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
  {n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
  {n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
  {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
  ? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
  . 匹配除 "/n" 之外的任何单个字符。要匹配包括 '/n' 在内的任何字符,请使用象 '[./n]' 的模式。
  (pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '/(' 或 '/)'。
  (?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
  (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
  (?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
  x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
  [xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
  [^xyz] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
  [a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
  [^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
  /b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er/b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
  /B 匹配非单词边界。'er/B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
  /cx 匹配由 x 指明的控制字符。例如, /cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
  /d 匹配一个数字字符。等价于 [0-9]。
  /D 匹配一个非数字字符。等价于 [^0-9]。
  /f 匹配一个换页符。等价于 /x0c 和 /cL。
  /n 匹配一个换行符。等价于 /x0a 和 /cJ。
  /r 匹配一个回车符。等价于 /x0d 和 /cM。
  /s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ /f/n/r/t/v]。
  /S 匹配任何非空白字符。等价于 [^ /f/n/r/t/v]。
  /t 匹配一个制表符。等价于 /x09 和 /cI。
  /v 匹配一个垂直制表符。等价于 /x0b 和 /cK。
  /w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
  /W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
  /xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'/x41' 匹配 "A"。'/x041' 则等价于 '/x04' & "1"。正则表达式中可以使用 ASCII 编码。.
  /num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)/1' 匹配两个连续的相同字符。
  /n 标识一个八进制转义值或一个向后引用。如果 /n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
  /nm 标识一个八进制转义值或一个向后引用。如果 /nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 /nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 /nm 将匹配八进制转义值 nm。
  /nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
  /un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, /u00A9 匹配版权符号 (?)。
 
  6. 部分例子
  正则表达式 说明
  //b([a-z]+) /1/b/gi 一个单词连续出现的位置
  /(/w+):////([^/:]+)(:/d*)?([^# ]*)/ 将一个URL解析为协议、域、端口及相对路径
  /^(?:Chapter|Section) [1-9][0-9]{0,1}$/ 定位章节的位置
  /[-a-z]/ A至z共26个字母再加一个-号。
  /ter/b/ 可匹配chapter,而不能terminal
  //Bapt/ 可匹配chapter,而不能aptitude
  /Windows(?=95 |98 |NT )/ 可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后,从Windows后面开始进行下一次的检索匹配。
 
  7. 正则表达式匹配规则
 
  7.1 基本模式匹配
 
     一切从最基本的开始。模式,是正规表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如:
 
  ^once
 
    这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was a man from NewYork"不匹配。正如如^符号表示开头一样,$符号用来匹配那些以给定模式结尾的字符串。
 
  bucket$
 
    这个模式与"Who kept all of this cash in a bucket"匹配,与"buckets"不匹配。字符^和$同时使用时,表示精确匹配(字符串与模式一样)。例如:
 
  ^bucket$
 
    只匹配字符串"bucket"。如果一个模式不包括^和$,那么它与任何包含该模式的字符串匹配。例如:模式
 
  once
 
  8.posix和perl标准的正则表达式区别
 
  PHP同时使用两套正则表达式规则,一套是由电气和电子工程师协会(IEEE)制定的POSIX Extended 1003.2兼容正则(事实上PHP对此标准的支持并不完善),另一套来自PCRE(Perl Compatible Regular Expression)库提供PERL兼容正则,这是个开放源代码的软件,作者为 Philip Hazel。
 
  使用POSIX兼容规则的函数有:
  ereg_replace()
  ereg()
  eregi()
  eregi_replace()
  split()
  spliti()
  sql_regcase()
  mb_ereg_match()
  mb_ereg_replace()
  mb_ereg_search_getpos()
  mb_ereg_search_getregs()
  mb_ereg_search_init()
  mb_ereg_search_pos()
  mb_ereg_search_regs()
  mb_ereg_search_setpos()
  mb_ereg_search()
  mb_ereg()
  mb_eregi_replace()
  mb_eregi()
  mb_regex_encoding()
  mb_regex_set_options()
  mb_split()
 
  使用PERL兼容规则的函数有:
  preg_grep()
  preg_replace_callback()
  preg_match_all()
  preg_match()
  preg_quote()
  preg_split()
  preg_replace()
 
  定界符:
 
  POSIX兼容正则没有定界符,函数的相应参数会被认为是正则。
 
  PERL兼容正则可以使用任何不是字母、数字或反斜线(/)的字符作为定界符,如果作为定界符的字符必须被用在表达式本身中,则需要用反斜线转义。也可以使用(),{},[] 和 <> 作为定界符
 
  修正符:
 
  POSIX兼容正则没有修正符。
 
  PERL兼容正则中可能使用的修正符(修正符中的空格和换行被忽略,其它字符会导致错误):
 
  i (PCRE_CASELESS):
  匹配时忽略大小写。
 
  m(PCRE_MULTILINE):
  当设定了此修正符,行起始(^)和行结束($)除了匹配整个字符串开头和结束外,还分别匹配其中的换行符(/n)的之后和之前。
 
  s(PCRE_DOTALL):
  如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。
 
  x(PCRE_EXTENDED):
  如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略。
 
  e:
  如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。 只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。
 
  A(PCRE_ANCHORED):
  如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。
 
  D(PCRE_DOLLAR_ENDONLY):
  如果设定了此修正符,模式中的行结束($)仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,也会被匹配在里面。如果设定了 m 修正符则忽略此选项。
 
  S:
  当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。
 
  U(PCRE_UNGREEDY):
  使“?”的默认匹配成为贪婪状态的。
 
  X(PCRE_EXTRA):
  模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。
 
  u(PCRE_UTF8):
  模式字符串被当成UTF-8。
 
  匹配次数与“{}”相关:
 
  POSIX兼容正则和PERL兼容正则在匹配次数方面完全一致:
  {2}:表示匹配前面的字符2次
  {2,}:表示匹配前面的字符2次或多次,默认都是贪婪(尽可能多)的匹配
  {2,4}:表示匹配前面的字符2次或4次
 
  逻辑区间与“()”相关:
 
  使用()包含起来的区域是一个逻辑区间,逻辑区间的主要作用是体现出一些字符出现的逻辑次序,另一个用处就是可以用来引用(可以将此区间内的值引用给一个变量)。后一个作用比较奇特:
  <?php
  $str = "http://www.163.com/";
  // POSIX兼容正则:
  echo ereg_replace("(.+)","<a href = //1 >//1</a>",$str);
  // PERL兼容正则:
  echo preg_replace("/(.+)/","<a href = $1 >$1</a>",$str);
  // 显示两个链接
  ?>
 
  在引用的时候,括号是可以嵌套的,逻辑次序是按照“(”出现的次序来标定的。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读