任何有编程经验的人都应该熟悉正则表达式。正则表达式描述了一个字符串匹配模式(pattern),可以用来检查字符串是否包含某个子串,替换匹配的子串,或者提取满足某个条件的字符串。substring等。平时,我并没有系统地学习过正则表达式的知识。大多数情况下,我会在使用的时候找到相关的语法来满足要求。最近对PHP的正则表达式进行了专题阅读,收获颇丰,所以写个笔记记录一下。PHP对正则表达式的支持PHP中处理正则表达式的函数有两类,一类是PCRE库提供的函数,它们以前缀preg_开头;另一个是POSIX扩展提供的函数,它们以ereg_前缀开头。但是从PHP5.3.0开始不再推荐后者,所以下面的知识针对的是PCRE模式。PHP正则表达式的组成PHP中的正则表达式由以下三部分组成:定界符表达式修饰符例如:/[a-zA-Z0-9-_]+/m上例中:字符串结尾/属于正则表达式的分隔符,可以是任何非字母数字、非反斜杠和非空白字符;中间部分的分隔符[a-zA-Z0-9-_]+属于正则表达式公式的表达式;正则表达式m的最后一部分是修饰符,其中m表示多行选择。元字符正则表达式的力量来自于它们在模式中选择和重复的能力。有些字符被赋予了特殊的含义,使它们不再简单地代表自己,这种在模式中具有特殊含义的编码字符称为元字符。元字符含义\一般用于转义字符^断言目标的起始位置(或多行模式下的行首)$断言目标的结束位置(或多行模式下的行尾)模式)。匹配除换行符之外的任何字符(默认)[开始字符类定义]结束字符类定义|开始一个可选的分支(子组开始标签)子组结束标签?作为量词,表示0或1个匹配项。位于量词之后,用于改变量词的贪心特性。(见量词)*quantifier,0ormorematches+quantifier,1ormorematches{customquantifierstarttag}customquantifierendtag正则表达式语法characterclass(squarebracket)openingsquarebracketstartone一个字符类的描述,终止带方括号。单个右方括号没有特殊含义。如果需要使用右方括号作为字符类的成员,则可以将其写在字符类的第一个字符处(如果使用^进行反转,则为第二个字符)或使用转义字符。字符类匹配目标字符串中的单个字符;该字符必须是字符类中定义的一组字符之一,除非^用于否定字符类。例如:[\d]匹配所有数字[^\d]匹配除数字以外的所有字符可选路径(|)竖线字符用于分隔模式中的可选路径。垂直条可以在模式中出现任意次数,并且允许空的可选路径(匹配空字符串)。匹配过程从左到右尝试每条备选路径,并使用第一个匹配成功的路径。示例:模式gilbert|Sullivan匹配gilbert或sullivan。子组(subpatterns)子组由括号分隔符分隔,它们可以嵌套。子群有两个作用:1.本地化可选分支;2.设置子组为捕获子组。例如:模式cat(arcat|erpillar|)匹配cat、cataract和caterpillar中的反向引用。在反斜杠后加一个大于零的数,可以引用模式前面抓取的内容,称为反向引用。如果反斜杠后面的数字小于10,则它始终是反向引用,如果模式中没有那么多捕获组,则会引发错误。例如:模式(sens|respons)e和\1ibility将匹配sense和sensitivity以及response和responsibility,但不匹配sense和responsibility。断言断言只是对当前匹配位置之前或之后字符的测试,而不实际消耗任何字符。它有两种类型:前瞻性断言(从当前位置向前测试)和后视断言(从当前位置向后测试);每种类型又分为积极断言和消极断言。所以有四种断言:1.前瞻性正断言(?=2.前瞻性负断言(?!3.后视正断言(?<=4.后视负断言(?
