您当前的位置:首页 > 网站建设笔记 >

PHP正则表达式的元字符/字符类/锚定模式/竖线介绍

来源:网站程序网0

preg函数使用了一个模拟Perl编程语言正则表达式功能的库。这一点很棒,因为利用Perl可以对正则表达式做各种各样有趣的处理,包括非贪婪匹配、前向和后向断言,甚至递归模式。

没有理由再使用ereg函数了,这些函数已经在PHP 5.3.0被正式废弃。它们提供的特性比较少,而且比preg函数速度慢。不过,在引入preg函数之前,ereg函数已经在PHP中存在了很多年,由于遗留代码的原因或者出于原先的习惯,很多程序员仍然在使用这些函数。好在,这两组函数的原型是一样的,所以可以很容易在这两组函数之间来回切换,而不会有太多麻烦。

可以把正则表达式看作是采用一种受限编程语言编写的程序。正则表达式程序的唯一任务就是匹配文本中的一个模式。在正则表达式模式中,大多数字符只匹配自身。也就是说,正则表达式wangzhan将匹配包含7字符序列wangzhan的字符串。正则表达式的特别之处在于它提供了一组称为元字符(metacharacters)的标点和符号。这些符号不是按字面匹配自身,而是向正则表达式匹配程序发出命令。最常用的元字符包括点号、星号、加号和问号(要按字面匹配模式中的一个元字符,需要在这个字符前面加一个反斜线)。

  • 点号表示匹配一个任意字符,所以模式.at可以匹配bat、cat甚至rat。
  • 星号表示匹配前面的0个或多个对象,到目前为止,我们知道的对象都是字符。
  • 加号与星号类似,不过表示匹配前面的1个或多个对象。所以.+at匹配brat、sprat甚至catastrophe中的cat,不过不能匹配at。要匹配at,需要把加号替换为星号。
  • 问号表示前一个对象是可选的,也就是说,匹配前面的0个或1个对象。例如,colou?r可以匹配color和colour。

将星号和加号应用到多于一个字符的对象时,要把对象中包含的字符序列放在小括号里。可以利用小括号对字符分组,来实现更复杂的匹配,还可以捕获其中的模式部分。可以用preg_replace()引用所捕获的序列来修改一个字符串,捕获的所有匹配都可以存储在一个数组中,作为第三个参数传入preg_match()和preg_match_all()。preg_match_all()函数类似preg_match(),不过它会查找一个字符串中所有可能的匹配,而不是找到第一个匹配时就停止。

使用preg函数

通常情况下,模式定界符是/,用来开始和结束模式字符串。如果模式定界符作为一个字面量字符出现在模式中,则需要加一个反斜线转义,所以在匹配HTML或XML时,这个定界符模式看起来就很笨拙。前面的代码在第一个模式字符串中使用开始和结束大括号作为定界符来避免这个问题。所有非字母数字、非空白符字符(除了反斜线)都可以用作为模式定界符。如果使用开始中括号字符作为开始定界符,那么可以使用一个相应的结束中括号作为结束定界符。

ereg和preg函数有一些主要区别。首先,使用preg函数时,模式不只是字符串模式。与Perl中类似,还需要有定界符,所以应当是/pattern/或者{pattern},<pattern>,|pattern|,#pattern#,或者可以是你喜欢的任何其他定界符。如果使用一个配对的开始字符如(,<,[或{作为开始定界符,PHP则希望相应的结束字符作为结束定界符),>,],或}。如果使用其他字符作为开始定界符,PHP则希望用同一个字符作为结束定界符。

如果希望字符串与一组特定的字符匹配,可以创建一个字符类,将你希望的字符放在中括号里。字符类[aeiou]可以匹配a,e,i,o和u中的任意一个字符。还可以在中括号中指定一个范围来建立字符类。字符类[a-z]可以匹配所有小写的英语字母。字母类[a-zA-Z0-9]可以匹配数字和英语字母。字符类[a-zA-Z0-9_]可以匹配数字、英语字母和下划线。

到目前为止,我们看到的所有模式可以匹配任意字符串,只要其中包含对应这个模式的文本。也就是说,[a-z0-9]+可以匹配wangzhanchengxu和wang2016cheng,不过也可以匹配grr!!!和*****\*\*p。所有这4个字符串都满足[a-z0-9]+设定的条件:一个或多个数字或小写英语字母。

通过锚定(Anchoring)模式,将匹配只包含模式所描述字符的字符串。脱字符^和美元符$分别在字符串开始和末尾锚定模式。如果没有这两个字符,可以在字符串中的任意位置匹配。所以尽管[a-z0-9]+表示一个或多个数字或小写英语字母,但^[a-z0-9]+表示从一个或多个数字或小写英语字母开头,[a-z0-9]+$表示以一个或多个数字或小写英语字母结尾,^[a-z0-9]+$则表示只包含一个或多个数字或小写英语字母。

如果按相反的结果来定义所查找的字符串更容易,那就尽量采用这种做法。要让一个字符类匹配其中字符的反集,可以在字符类前面加一个脱字符。字符类之外的脱字符用于在字符串开头锚定一个模式,而字符类内部的脱字符则表示匹配中括号中所列字符以外的其他字符。例如,字符类[^aeiou]会匹配非小写英语元音字符的其他字符。需要说明,[aeiou]的反集并不是[bcdfghjklmnpqrstvwxyz]。字符类[^aeiou]还可以匹配大写元音字符、数字、URL甚至表情符号。

竖线也称为管道符号,可以指定候选项。以下使用管道来查找一个文本块中各种可能的图像文件名。

顶部中部底部