课程咨询 :13623629309

太原PHP培训 > 达内新闻 > 最通俗易懂的php正则表达式教程(中)
  • 最通俗易懂的php正则表达式教程(中)

    发布:资源共享      来源:资源共享      时间:2016-10-17

  • 最通俗易懂的php正则表达式教程(中)

    继续上文的内容,太原php培训班继续为大家介绍PHP相关知识助大家一臂之力。

    正则表达式简介

    正则表达式是用于描述字符排列模式一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。到目前为止,我们前面所用过的精确(文本)匹配也是一种正则表达式。

    PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本模式的程序性描述。

    在程序语言中,通常将模式表达式(即正则表达式)包含在两个反斜线“/”之间,如“/apple/”。用户只要把需要匹配的模式内容放入定界之间即可。

    如果使用一个没有特殊字符的正则表达式,相当于纯文本搜索,使用strstr( )函数也可达到同样的效果。

    PHP中有两套正则表达式函数库,两者功能相似,只是执行效率略有差异:

    一套是由PCRE(Perl Compatible Regular Expression)库提供的。使用“preg_”为前缀命名的函数;

    一套由POSIX(Portable Operation System interface)扩展提供的。使用以“ereg_”为前缀命名的函数;

    使用正则表达式的原因之一,是在典型的搜索和替换操作中,只能对确切文字进行匹配,对象动态文本的搜索就有困难了,甚至是不可能的。

    /^-?\d+$|^-?0[xX][\da-fA-F]+$/

    /^[0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+(\.[0-9a-zA-Z_-]+){0,3}]$/

    正则表达式较重要和较有用的角色是验证用户数据的有效性检查。PHP中,正则表达式有三个作用:

    匹配,也常常用于从字符串中析取信息。

    用新文本代替匹配文本。

    将一个字符串拆分为一组更小的信息块。

    正则表达式的语法规则

    正则表达式是主要由:

    原子(普通字符,如英文字符)

    元字符(有特殊功用的字符)

    以及模式修正字符组成。

    一个正则表达式中至少包含一个原子。

    原子(Atom)

    原子是组成正则表达式的基本单位,在分析正则表达式时,应作为一个整体。

    原子字符是由所有末显式指定为元字符的打印和非打印字符组成。这包括所有的英文字母、数字、标点符号以及其他一些符号。原子也包括以下内容。

    单个字符、数字,如a~z,A~Z,0~9.

    模式单元,如(ABC).可以理解为由多个原子组成的大的原子。

    原子表,如[ABC].

    重新使用的模式单元。

    普通转义字符。

    转义元字符。

    正则表达式所使用的普通转义字符

    原子说明

    \d匹配一个数字;等价于 [0-9]

    \D匹配除数字以外任何一个字符;等价于 [^0-9]

    \w匹配一个英文字母、数字或下划线;等价于 [0-9a-zA-Z_]

    \W匹配除英文字母、数字和下划线以外任何一个字符;等价于 [^0-9a-zA-Z_]

    \s匹配一个空白字符;等价于 [\f\n\r\t\v]

    \S匹配除空白字符以外任何一个字符;等价于 [^\f\n\r\t\v]

    \f匹配一个换页符等价于 \x0c \cL

    \n匹配一个换行符;等价于 \x0a \cJ

    \r匹配一个回车符等价于 \x0d \cM

    \t匹配一个制表符;等价于 \x09\ \cl

    \v匹配一个垂直制表符;等价于 \x0b \ck

    \oNN匹配一个八进制数字

    \xNN匹配一个十六进制数字

    \cC匹配一个控制字符

    元字符(Meta-character)

    元字符是用于构造规则表达式的具有特殊含义的字符。如果要在正则表达式中包含元字符本身,必须在其前加上”\”进行转义

    说明元字符

    *0 次、 1 次或多次匹配其前的原子

    +1 次或多次匹配其前的原子

    ?0 次或 1 次匹配其前的原子

    .匹配任何一个字符

    |匹配两个或多个选择

    ^\A匹配字符串串首的原子

    $\Z匹配字符串串尾的原子

    \b匹配单词的边界

    \B匹配除单词边界以外的部分

    []匹配方括号中的任一原子

    [^]匹配除方括号中的原子外的任何字符

    ()整体表示一个原子

    {m}表示其前原子恰好出现 m

    {m,n}表示其前原子至少出现 m 次,至多出现 n (n>m)

    {m,}表示其前原子出现不少于 m

    原子表

    原子表”[]”中存放一组原子,彼此地位平等,且仅匹配其中的一个原子。如果想匹配一个 ”a” ”e” 使用 / [ae]/, 例如: /Pr[ae]y/ 匹配 ”Pray” 或者 ”Prey ”

    原子表 ”^” 或者称为排除原子表,匹配除表内原子外的任意一个字符。例如:/p[^u]/匹配“part”中的“pa”,但无法匹配“computer”中的“pu”因为“u”在匹配中被排除。

    通常,在原子表中用“-”连接一组按ASCII码顺序排列的原子,用以简化书写。 /x[0123456789]可以写成/x[0-9]/,用来匹配一个由 “x” 字母与一个数字组成的字符串;

    /0[xX][0-9a-fA-F]/匹配一个简单的十六进制数字,如“0x9”/[^0-9a-zA-Z_]/匹配除英文字母、数字和下划线以外任何一个字符,其等价于/\W/

    重复匹配

    正则表达式中有一些用于重复匹配其前原子的元字符:“?”“*”“+”。他们主要的不同是重复匹配的次数不同。

    元字符“?”表示0次或1次匹配紧接在其前的原子。例如:/colou?r/匹配“colour”“color”

    元字符“*”表示0次、1次或多次匹配紧接在其前的原子。例如:/^<[A-Za-z][A-Za-z0-9]*>$/可以匹配

    “”HTML标签,并且不严格的控制大小写。

    元字符“+”表示1次或多次匹配紧接在其前的原子。例如:/go+gle/ 匹配“gogle”“google”“gooogle”等中间含有多个o的字符串。上文中提及的十六进制数字的例子,实际上更加完善的匹配表达式是/^0?[ xX][0-9a-fA-F]+$/,可以匹配“0x9B3C”或者“X800”等。

    要准确地指定原子重复的次数,还可以使用元字符“{}”指定所匹配的原子出现的次数。“{m}”表示其前原子恰好出现m;“{mn}”表示其前原子至少出现m次,至多出现n;“{m}”表示其前原子出现不少于m次。

    以下是一些示例。

    /zo{1,3}m/只能匹配字符串“zom”“zoom”、或“zooom”

    /zo{3}m/只能匹配字符串“zooom”

    /zo{3}m/ 可以匹配以 “z” 开头,“m”结束,中间至少为3“o”的字符串。

    /bo{0,1}u/可以匹配字符串“bought a butter” 中的“bou”“bu”,起完全等价于/bo?u/

    边界限制

    在某些情况下,需要对匹配范围进行限定,以获得更准确的匹配结果。

    元字符“^”(“\A”)置于字符串的开始确保模式匹配出现在字符串首端;

    “$”(“\Z”)置于字符串的结束,确保模式匹配出现字符串尾端。

    例如,在字符串“Tom and Jerry chased each other in the house until tom’s uncel come in”中使用/^TomAtom匹配句首的“Tom”; /in$/in\Z匹配句末“come in”中的“in”。如果不加边界限制元字符,将获得更多的匹配结果。

    在使用各种编辑软件的查找功能时,可以通过选择按单词查找获得更准确的结果。正则表达式中也提供类似的功能。

    元字符“\b”对单词的边界进行匹配;

    “\B”对单词的内部进行匹配。

    例如:在字符串“This island is a beautiful land”中使用/\bis\b/可以匹配单词“is”而与“This”或者“island”无关。/\bis/与单词边界匹配,可以匹配单词“is”“island”中的“is”;/\Bis/不与单词左边界匹配,可以匹配单词“is”“This”中的“is”./\Bis\B将明确的指示不与单词的左、右边界匹配,只匹配单词的内部。所以在这个例子中没有结果。

    元字符 “.”

    元字符“.”匹配除换行符外任何一个字符,相当于[^\n](Unix系统)[^\r\n](windows系统)

    例如:/pr.y/可以匹配的字符串“prey”“pray”“pr%y”等。

    通常可以使用“.*”组合来匹配除换行符外的任何字符。在一些书籍中也称其为全匹配符单含匹配符

    例如/a.*z/表示可以匹配字母“a”开头,字母“z”结束的任意不包括换行符的字符串。“.+”也可以完成类似的匹配功能所不同的是其至少匹配一个字符。例如/a.+z/将不匹配字符串“az”

    模式选择符

    元字符“|”又称模式选择符。在正则表达式中匹配两个或更多的选择之一。

    例如:

    在字符串“There are many apples and pears.”中,/apple|pear/在第一次运行时匹配“apple”;再次运行时匹配“ pear”。也可以继续增加选项,如/apple|pear|banana|lemon/

    模式单元

    元字符“()”将其中的正则表达式变为原子(或称模式单元)使用。与数学表达式中的括号类似,“()”可以做一个单元被单独使用。

    例如:

    /(Dog)+/匹配的“Dog”“DogDog”“DogDogDog”……..,因为紧接着“+”前的原子是元字符“()”括起来的字符串“Dog”

    一个模式单元中的表达式将被优先匹配或运算。系统自动将这些模式单元的匹配依次存储起来,在需要时可以用“\1”“\2”“\3”的形式进行引用。当正则表达式包含有相同的模式单元时,这种方法非常便于对其进行管理。

    例如:

    /^\d{2}([\W])\d{2}\\1\d{4}$匹配“12-31-2006”“09/27/1996”“86 01 4321”等字符串。但上述正则表达式不匹配“12/34-5678”的格式。这是因为模式“[\W]”的结果“/”已经被存储。下个位置“\1”引用时,其匹配模式也是字符“/”

    模式修正符(Pattern Modifiers)

    模式修正符扩展了正则表达式在字符匹配、替换操作时的某些功能。这些扩展或者说修正增强了正则表达式的处理能力。模式修正符一般标记于整个模式之外,并且可以组合使用,如“/apple/i”“/cat|dog/uis”等。表列出了一些常用的模式修正符极其功能说明。

    模式修正符说明

    i可同时匹配大小写字母

    M将字符串视为多行

    S将字符串视为单行,换行符做为普通字符看待

    x模式中的空白忽略不计

    S当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析

    U匹配到最近的字符串

    e将替换的字符串作为表达使用

    下面是几个简单的示例,可以说明模式修正符的使用

    /apple/i匹配“apple”“Apple”等,忽略大小写。

    /I love you/ix匹配“iloveYou”,忽略大小写以及空白。

    /<.*>/ U将依次匹配字符串“Cool music

    Few years ago….. ”中的“”“”

    。而/<.*>/却匹配到最后一个可用的字符串,既“Coolmusic

    //UisHTML文件视为单行字符串,忽略大小写和换行符。匹配其中中的所有以“h”开头的标签,如“”

    等。

    好了,今天就给大家讲这么多吧,喜欢我的内容可以关注或者分享(微信公众平台:tytedu)选择太原达内培训,不再孤军奋战,轻轻松松做IT高薪白领。太原达内培训带领有明确目标的学子迈向成功之路!

上一篇:最通俗易懂的php正则表达式教程(上)

下一篇:最通俗易懂的php正则表达式教程(三)

最新开班日期  |  更多

php高级开发名企定制班(剩2个名额)

php高级开发名企定制班(剩2个名额)

开班日期:12-30

php高级开发周末班(剩5个名额)

php高级开发周末班(剩5个名额)

开班日期:12-30

php高级开发免费试听(剩5个名额)

php高级开发免费试听(剩5个名额)

开班日期:12-30

更多高级开发工程师精品班

更多高级开发工程师精品班

开班日期:12-30

  • 地址:山西省太原市小店区学府街长治路高新国际A座24层
  • 课程培训电话:13623629309     全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56

    在线客服系统