php中的正则表达

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

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

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

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

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

                空白字符:

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

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

                     \n   : 换行符

                     \r    : 回车符

                      \t   : 制表符

                      \v  :垂直制表符

            特殊的原子字符:

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

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

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

                 \s匹配任意空白字符

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

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

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

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

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

             ? 表示匹配0次或是一次其前的字符 如: ‘/a\s+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,即使字符中有换行符也视为"一行")

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

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

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

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

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

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

           模式单元:

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

       5:|

修正符:

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

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

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

                   字符: this \n  is \n a \n 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‘ == 贪婪模式

 

     

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。