zoukankan      html  css  js  c++  java
  • PHP正则表达式函数学习

    正则表达式是在日常开发中经常用到的,通常一些使用频率过高的正则表达式都是直接粘贴复制,对于基础正则的使用还是要铭记于心的,今天抽时间整理一些php正则表达式的用法。

    一、php中常用的正则表达式函数

      preg_match() 与 preg_match_all()

      1、preg_match ( $pattern, $subject, [ array &$matchs ] );   //执行匹配正则表达式

      2、preg_match_all ( $pattern, $subject, array &$matches ); //执行一个全局正则表达式匹配

      返回结果:匹配到结果的次数;

      参数说明

        pattern 要搜索的模式,字符串类型

        subject 输入字符串

        matches 对于第一个函数,如果提供了参数matches,它将被填充为搜索结果。$matches[0]将包含完整模式匹配到的文本,$matches[1] 将包含捕获子组匹配到的文本。

            对于第二个函数,matches是必填项,它是一个多维数组,作为输出参数输出所有匹配结果, 数组排序通过flags指定。

    一个简单的demo来查看区别:

    $pattern = '/[0-9]/';
    $subject = 'afdddd3asfs4asf6asf1';
    $m1= $m2 = [];
    
    preg_match($pattern, $subject, $m1);
    preg_match_all($pattern, $subject, $m2);
    
    show($m1);
    echo '<hr>';
    show($m2);  

    结果: 

    Array
    (
        [0] => 3
    )
    ----------------------
    Array
    (
        [0] => Array
            (
                [0] => 3
                [1] => 4
                [2] => 6
                [3] => 1
            )
    
    )
    

      preg_replace 与 preg_filter

      3、preg_replace ( $pattern, $replacement, $subject )  //执行一个正则表达式的搜索和替换

      4、preg_filter ( $pattern, $replacement, $subject )       //执行一个正则表达式搜索和替换

       参数说明

        pattern 要搜索的模式。可以使一个字符串或者字符串数组。可以使用PCRE修饰符

        replacement 用于替换的字符串或者字符串数组。

        subject 要进行搜索和替换的字符串或字符串数组。

      区别:preg_filter 它仅仅返回(可能经过转化)与目标匹配的结果,功能和preg_replace类似

      返回值:如果subject是一个数组,返回一个数组, 其他情况返回一个字符串。

          如果没有找到匹配或者发生了错误,当subject数组 时返回一个空数组,其他情况返回NULL

    分别用3个简单的demo来查看区别:

    测试1: 

    $pattern = '/[0-9]/';
    $subject = 'afdddd3asfs4asf6asf1';
    $replacement = 'CHINA';
    
    $str1 = preg_replace($pattern, $replacement, $subject);
    $str2 = preg_filter($pattern, $replacement, $subject);
    
    show($str1);
    echo '<hr>';
    show($str2);
    

     结果1: 

    afddddCHINAasfsCHINAasfCHINAasfCHINA
    ------------------------------------- afddddCHINAasfsCHINAasfCHINAasfCHINA

     preg_replace 和 preg_filter都支持数组替换的,继续看区别

     测试2: 

    //$pattern = '/[0-9]/';
    $pattern = [ '/[123]/', '/[4567]/', '/[890]/'];
    $subject = 'afdddd3asfs4asf9asf1';
    //$replacement = 'CHINA';
    $replacement = ['你', '好', '吗'];
    
    $str1 = preg_replace($pattern, $replacement, $subject);
    $str2 = preg_filter($pattern, $replacement, $subject);
    
    show($str1);
    echo '<hr>';
    show($str2);
    

     结果2:

    afdddd你asfs好asf吗asf你
    ------------------------------
    afdddd你asfs好asf吗asf你
    

     貌似还是没有区别和变化,继续测试

       测试3: 

    //$pattern = '/[0-9]/';
    $pattern = [ '/[123]/', '/[4567]/', '/[890]/'];
    //$subject = 'afdddd3asfs4asf9asf1';
    $subject = ['afddd', 'd3asf', 's4', 'as', '9as', 'f1'];
    //$replacement = 'CHINA';
    $replacement = ['你', '好', '吗'];
    
    $str1 = preg_replace($pattern, $replacement, $subject);
    $str2 = preg_filter($pattern, $replacement, $subject);
    
    show($str1);
    echo '<hr>';
    show($str2);
    

      结果3:

    Array
    (
        [0] => afddd
        [1] => d你asf
        [2] => s好
        [3] => as
        [4] => 吗as
        [5] => f你
    )
    --------------------
    Array
    (
        [1] => d你asf
        [2] => s好
        [4] => 吗as
        [5] => f你
    )
    

      由此可见,preg_replace 替换会把每一个数组中的元素都进行一次匹配替换,无论有没有匹配成功,返回值中的元素都会保留,而preg_filter 只会保留匹配成功的元素;

      5、preg_grep ( $pattern, array $input ) // 返回匹配模式的数组条目

        只做匹配,不做替换,是preg_filter的简版;

      参数说明

        pattern 要搜索的模式,字符串形式

        input 输入数组

    通过demo查看效果:

    $pattern = '/[0-9]/';
    $subject = ['afddd', 'd3asf', 's4', 'as', '9as', 'f1'];
    $str1 = preg_grep($pattern, $subject);
    show($str1);
    

     结果:

    Array
    (
        [1] => d3asf
        [2] => s4
        [4] => 9as
        [5] => f1
    )
    

      由此可见,preg_grep针对 subject 中的每一个元素都进行了匹配,且结果只会打印匹配到的数据;

      6、preg_split ( $pattern, $subject ) // 通过一个正则表达式分隔字符串

      说明:通过正则表达式匹配字符串,将字符串按正则拆分成数组,如果你不需要正则表达式功能,可以有更快(并且更简单)的选择比如 explode() 或 str_split()如果没有成功匹配,将会返回一个数组,包含了单个元素,即输入的字符串。

      参数说明:

        pattern 用搜索的模式,字符串形式。

        subject 输入字符串

    通过demo查看效果:

    $pattern = '/[0-9]/';
    $subject = '我在3上海5,你知道2的吗?';
    $str1 = preg_split($pattern, $subject);
    show($str1);
    

      结果:

    Array
    (
        [0] => 我在
        [1] => 上海
        [2] => ,你知道
        [3] => 的吗?
    )
    

      由此可见,通过正则表达式,凡是遇到0-9之间的阿拉伯数字都会切一刀拆分成数组;

      7、preg_quote($str) //转义正则表达式字符

        说明:preg_quote()需要参数 str 并向其中 每个正则表达式语法中的字符前增加一个反斜线。 这通常用于你有一些运行时字符串 需要作为正则表达式进行匹配的时候。

          正则表达式特殊字符有: . + * ? [ ^ ] $ ( ) { } = ! < > | : -

       注意 / 不是正则表达式特殊字符  

        用demo示例效果:

    $str = 'this is {abc} and [456]';
    $str = preg_quote($str);
    show($str);
    

      结果:

    this is {abc} and [456]
    

      由此可见,{} 花括号和 [] 方括号都是正则表达式的特殊符号,通过preg_quote 函数进行转译后多了\,因此进行正则匹配的时候会忽略该特殊符号;

    二、正则表达式常用总结

      1、都以preg_ 开头

      2、除 preg_quote 函数之外,第一个参数都是正则表达式

      3、preg_match -------表单验证等

      4、preg_replace -----非法词语过滤等

     

     注:学习笔记

      

          

      

  • 相关阅读:
    secureCRT使用pem私钥
    常用的GoLang包工具
    解决vs code 调试golang时字符串显示不全的问题
    git 常用操作
    go sqlx db.Query需手动释放
    go dlv 调试
    Ambari中superset-hive认证
    HDP3.x hive load data local inpath 设置
    dolphinscheduler-调度
    sourceTree 提交错误
  • 原文地址:https://www.cnblogs.com/dump/p/8268285.html
Copyright © 2011-2022 走看看