zoukankan      html  css  js  c++  java
  • PHP正则 正向预查&反向预查

    了解正向预查&反向预查前,我们先要知道正则的2个函数:preg_match_all 、 preg_replace

    preg_match_all 可以看文章:点击查看

    preg_replace 可以看文章:点击查看

    正向预查&反向预查

    正向或反向预查都是非获取匹配,不进行存储供以后使用。

    1、正向预查

    (?:pattern) 匹配结果

    (?=pattern) 正向匹配。

    (?!pattern) 正向不匹配。

    2、反向预查

    (?<=pattern) 反向匹配。

    (?<!pattern) 反向不匹配。

    什么叫非获取匹配(非捕获匹配),请看例子

    一:正向预查

    例1 :获取匹配

    $str = 'XXXXjava6java7XXXX';
    $perg = "/java(6|7)/";  //匹配java6 获取 java7 
    
    preg_match_all($perg, $str, $matchs);
    $str1 = preg_replace($perg, '', $str); //"XXXXjava6java7XXXX"
    $str2 = preg_replace($perg, '1', $str); //"XXXX67XXXX"
    

    $matchs 的输出结果:
    array(2) {
      [0]=>
      array(2) {
        [0]=>
        string(5) "java6"
        [1]=>
        string(5) "java7"
      }
      [1]=>
      array(2) {
        [0]=>
        string(1) "6"
        [1]=>
        string(1) "7"
      }
    }
    

      

     知道了preg_match_all的用法,对于上面的输出结果应该很清楚,[n]的后向引用。 [0]中保存的是匹配结果的全文,数组的个数=匹配到结果的个数,[1] 中保存的匹配结果中对应括号中匹配的结果(子组),.....[n]第n个括号中的匹配内容。

    preg_replace 中的 ,1,也是对匹配结果的引用。

    理解下:
    $str1 = preg_replace($perg, '', $str); //"XXXXjava6java7XXXX", 用全文中的匹配结果进行对应替换
    $str2 = preg_replace($perg, '1', $str); //"XXXX67XXXX",用括号中的子结果进行对应的替换
    

     我们对比知道, 的替换内容,是匹配全文的中内容,对应元素的替换。

    例2:匹配结果

    $str = 'XXXXjava6java7XXXX';
    $perg = "/java(?:6|7)/";  
    
    preg_match_all($perg, $str, $matchs);
    $str1 = preg_replace($perg, '', $str); //"XXXXjava6java7XXXX"
    

    $match 输出结果:

    array(1) {
      [0]=>
      array(2) {
        [0]=>
        string(5) "java6"
        [1]=>
        string(5) "java7"
      }
    }
    

      

    对比1中,我们发现没有括号匹配的结果,这就是我们说的非获取匹配,只匹配全本结果,不捕获括号中的子结果。



    例3:正向匹配
    $str = 'XXXXjava6java7XXXX';
    $perg = "/java(?=6|7)/";
    preg_match_all($perg, $str, $matchs);
    $str1 = preg_replace($perg, '', $str); //"XXXXjava6java7XXXX"
    var_dump("<pre>", $matchs, $str1);die;
    

      

    $match 输出结果:
    array(1) {
      [0]=>
      array(2) {
        [0]=>
        string(4) "java"
        [1]=>
        string(4) "java"
      }
    }
    

      

    相比上面的我们匹配的结果中没有 6,7.

    例4:正向不匹配

    $perg = "/java(?!6)/"; //不匹配java6
    preg_match_all($perg, $str, $matchs);
    $str1 = preg_replace($perg, '', $str); //"XXXXjava6java7XXXX"
    var_dump("<pre>", $matchs, $str1);die;
    

      

    $match 输出结果:
    array(1) {
      [0]=>
      array(1) {
        [0]=>
        string(4) "java"
      }
    }
    

      

    这里匹配的到结果是java7,但是由于我们用了非获取匹配,就不存贮7,剩下的就是java了

    主要:不管是怎么替换,如果我们只要用的是 (完整匹配结果) 中的结果进行替换,相当于匹配到了什么就替换掉原字符串中的什么,实际上原字符串没变化,

    二 . 反向预查

    (?<=pattern) 反向匹配。(?<=J)a,匹配紧跟字母J后面的a,结果Java6 Java7
    
    (?<!pattern) 反向不匹配。(?<!J)a,不匹配紧跟字母J后面的a,结果Java6 Java7
    

      

    总结:

    正向预查,反向预查,就是方向不同。如:正向预查时,具体字符串在左边,/java(?:6|7)/,从字符串开始向右查找;反向则在右边: / (?<=J)a /,从字符串向反方向(左)查找。

    
    
    


  • 相关阅读:
    thinkphp5 tp5 命名空间 报错 Namespace declaration statement has to be the very first statement in the script
    开启 php 错误 提示 php-fpm 重启 nginx 500错误 解决办法 wdlinux lnmp 一键包 php脚本无法解析执行
    js 设置 cookie 定时 弹出层 提示层 下次访问 不再显示 弹窗 getCookie setCookie setTimeout
    php 二维数组 转字符串 implode 方便 mysql in 查询
    nginx 重启 ps -ef|grep nginx kill -HUP 主进程号
    jquery bootstrap help-block input 表单 提示 帮助 信息
    jquery 倒计时 60秒 短信 验证码 js ajax 获取
    jQuery如何获取同一个类标签的所有的值 遍历
    linux下C语言文件操作相关函数
    gcc,gdb用法
  • 原文地址:https://www.cnblogs.com/echojson/p/10880750.html
Copyright © 2011-2022 走看看