zoukankan      html  css  js  c++  java
  • 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' == 贪婪模式

         

  • 相关阅读:
    配置日志
    部署项目到jetty
    部署web应用程序到tomcat
    spring boot 整合mybatis
    创建spring boot 项目
    发送http请求
    pom.xml文件中dependency标签的scope子标签
    Ubuntu apparmor何方神圣
    Ubuntu Nginx下配置网站ssl实现https访问
    打造私有的DNS 服务
  • 原文地址:https://www.cnblogs.com/phplhs/p/4361267.html
Copyright © 2011-2022 走看看