php中的正则表达

在PHP中实现正则一般情况下有两种方式使用PCRE库提供的兼容perl的方式或者使用POSIX的提供的方式。

因为,perg要比POSIX快,所以使用perg方式的。

     正则表达式一般实现对字符的,匹配,查找,替换,及分割问题。正则表达式一般有定界符,原子,元子符,模式修正符组成。

           定界符:区分正则表达式的,一般使用/,当然也可以使用其他非字母,数字以外的字符,如*,!,|。      例子:/正则表达式/模式匹配符。

          原子    :是正则表达式最基本的单位。一般包括字母,数字,特殊字符,如果元子符作为原子需要使用反斜线转义。

                空白字符:

                    cX  : 匹配由X指明的控制符,如cM匹配回车符。

                     f    : 匹配换页符,等价于 x0c和xL

                        : 换行符

                         : 回车符

                         : 制表符

                      v  :垂直制表符

            特殊的原子字符:

                 D 任意十进制之外的字符,等价于 [^0-9]

                  d 十进制字符=[0-9]

                 S匹配除空白字符外的任意字符 = [^f v]

                 s匹配任意空白字符

                 W 匹配任意一个字母数字下划线=[0-9_a-zA-Z]

                 w 匹配除字母,数字,下划线外的字符。

          元子符:在正则中具有特殊意义的字符。

             *表示匹配0次或是多次其前的字符  如: '/as*b/' 匹配任意个a和b之间的空白字符。

             +表示匹配 一次或是多次其前的字符 如: '/as+b/' a和b之间最少的有一个空白字符。

             ? 表示匹配0次或是一次其前的字符 如: '/as+b/' a和b之间有一个空白字符或是没有空白字符。

             . 表示匹配任意字符 除换行符以外,如果使用模式修正符s可以匹配换行符。 如: '/a.b/' a和b之间有任意一个字符。

             | 匹配分子选择 如: '/ab|ax|ac/' 匹配ab或是ac,ax。

             {N}匹配N次其前的字符

             {N,}最少匹配N次其前字符

             {N,M}最少匹配N次最多匹配M次其前字符。

             ^或是A : 匹配输入字符串的开始位置 如:'/^this/' 匹配以this开头的字符 (如果不使用模式修配符,m,即使字符中有换行符也视为"一行")

             $或是匹配字符串的结尾 如:'/this¥/' 匹配以this结尾的字符 (如果不使用模式修配符,m,即使字符中有换行符也视为"一行")

             匹配字符的边界  字符串: this is a test; 正则: '/is/' 匹配单词is,也就是说is两边不能有其它字符

            B匹配字符边界以外的部分 字符串: this is a test; 正则: '/Bis/' 可匹配单词this,也就是说is右边不能有其它字符

            [] 匹配多个方括号中的原子 [0-9] 匹配十进制数字

            [^] 不匹配多个方括号的原子

            () 视圆括号的正则为一个小整体,视为模式单元。 如'/(very)* good/'

           模式单元:

                模式单元在正则表达式内的后向引用。因为模式单元视为视为一个小整体,可以在正则表达式内复用,对于这样被()包裹的子表达式,程序在实现的时候会存储在一个临时的缓冲区,并 ,n为数字来编号最大可以编号为99。可以通过使用 编号来获取使用,在 正则中使用要加上转义字符相当于\n。

  当想要使用模式单元又不先要存储模式单元的时候可以使用 ?:,?=,?!来忽略相关匹配结果

      如: '/(Windows)(Linux)\2os/'  == '/(Windows)(Linux)(Linux)os/'

          '/(?:Windows)(Linux)\1os/'  == '/(Windows)(Linux)(Linux)os/'   忽略了第一个(Windows)

    模式匹配的优先级:

      1:

       2: (),(?:),(?!),(?=)

        3:*,+,?,{n},{n,},{n,m}

       4: ^,$,,B,A,

       5:|

修正符:

     模式修正符在定界符之外使用:

         i:不区分大小写的匹配  如:'/ab/i' 可以匹配:ab,Ab,aB,AB

        m:对于字符串中有换行符的使用m修正符可以视为多行.

                   字符: this   is a test

                  '/^is/m':因为使用了m修正符,可以匹配到第二行的开头的is ,或者无法匹配第二行is视为一行

        s:对于.元子符可以包括换行符。

       X:模式中的空白忽略不计。'/Web Server/ix' 可以匹配WebServer忽略空白符。

       e:在使用preg_replace函数中,将其作为php代码求值,用其结果来替换所搜索字符。

                 在使用preg_replace:

                     匹配日期:

                    $text = "10/01/2014"; 想要变成"2014-10-01";

                    $text = preg_replace("/d{2}/d{2}/d{4}/","\3-\1-\2",$text);

                   使用e模式修配符的替换:

                   $text = "<b>sdfs</b>"; // 想要把<>里的字符变成大写

                  $text = preg_replace("/(</?)(w+)([^>]*>)/e","'\1'.strtoupper('\2').'\3'",$text);

                      

       U:非贪婪匹配,如果使用了?并且也使用了U修正符,等同于贪婪模式匹配

                 '/a.*e/' 匹配字符 "abcdefghjkabcdehjjjabcdekl" ,由于使用了贪婪模式 会从第一个a匹配到最后一个e不会匹配abcde,如果想要取消

               '/a.*e/U'或是 '/a.*?e/'      '/a.*e?/U' == 贪婪模式

     

原文地址:https://www.cnblogs.com/phplhs/p/4361267.html