美文网首页
PHP基础 —— 正则表达式

PHP基础 —— 正则表达式

作者: WhiteStruggle | 来源:发表于2020-07-18 08:37 被阅读0次

    正则表达式

    用于复杂字符串的处理,简单字符串使用字符串函数处理

    语法规则

    由一个或者多个:

    1. 普通字符
    2. 元字符

    组成一个字符串

    定界符

    通常情况下,使用正斜线 / / 作为定界符

    注意:定界符前后要一致

    处了字母,数字和反斜线以外字符都可以作为定界符

    1. #
    2. !
    3. {}
    4. |

    preg_match_all() 按照指定的正则表达式,在给定的字符串内进行搜索,匹配到符合特征的部分取出

    preg_match_all($find,$str,[$array])
    
    $find  表示 正则表达式
    $str  表示 给定的字符串
    $array 表示 查找到的字符串存储的数组
    

    返回值:int,查找的个数

        <?php
            $find = "/Yz/";
            $str = "YZZyzyYzzYz";
            echo preg_match_all($find,$str,$arr);//2
            print_r($arr);//Array ( [0] => Array ( [0] => Yz [1] => Yz ) )
        ?>
    

    普通字符

    没有特殊意义

    如:
    a-z,A-Z,0-9,单引号,双引号

    元字符

    1. \d —— 匹配任意一个十进制数字,等价于[0-9]
        <?php
            $find1 = "/Yz\d/";
            $find2 = "/YZ[0-9]/";
            $str = "IamYZ5,youareYz1";
            echo preg_match_all($find1,$str,$arr1);//1
            echo preg_match_all($find2,$str,$arr2);//1
            print_r($arr1);//Array ( [0] => Array ( [0] => Yz1 ) )
            print_r($arr2);//Array ( [0] => Array ( [0] => YZ5 ) )
        ?>
    
    1. \D —— 匹配任意一个除十进制数字以外字符,等价于[^0-9]
        <?php
            $find1 = "/Yz\D/";
            $find2 = "/YZ[^0-9]/";
            $str = "IamYZ,youareYz.";
            echo preg_match_all($find1,$str,$arr1);//1
            echo preg_match_all($find2,$str,$arr2);//1
            print_r($arr1);//Array ( [0] => Array ( [0] => Yz. ) ) 
            print_r($arr2);//Array ( [0] => Array ( [0] => YZ, ) )
        ?>
    
    1. \s —— 匹配任意一个空字符串,比如换页符,换行符,回车符,制表符,垂直制表符
    • " ",空字符
    • "\t",制表符
    • "\n",换行符
    • "\r",回车符
    • "\x0B",垂直制表符
        <?php
            $find = "/Yz\s\d/";
            $str = "Yz 1,Yz\n1,Yz\t3,Yz\04,Yz\x0B5,Yz\r6";
            echo preg_match_all($find,$str,$arr);//5
            print_r($arr);
            //Array ( [0] => Array ( [0] => Yz 1 [1] => Yz 1 [2] => Yz 3 [3] => Yz�5 [4] => Yz 6 ) )
        ?>
    
    1. \S —— 匹配除空白字符以外的任意字符
        <?php
            $find = "/Yz\S\d/";
            $str = "Yz 1,Yz\n1,Yz\t3,Yz\04,Yz\x0B5,Yz\r6,Yz77,Yzz8";
            echo preg_match_all($find,$str,$arr);//2
            print_r($arr);//Array ( [0] => Array ( [0] => Yz77 [1] => Yzz8 ) )
        ?>
    
    1. \w —— 匹配任意一个数字或者字母或下划线
        <?php
            $find = "/Yz\w/";
            $str = "Yz1,Yzz,Yz_,Yz.,";
            echo preg_match_all($find,$str,$arr);//3
            print_r($arr);//Array ( [0] => Array ( [0] => Yz1 [1] => Yzz [2] => Yz_ ) )
        ?>
    
    1. \W —— 匹配除数字,字母,下划线以外的任意字符
        <?php
            $find = "/Yz\W/";
            $str = "Yz1,Yzz,Yz_,Yz.,";
            echo preg_match_all($find,$str,$arr);//1
            print_r($arr);//Array ( [0] => Array ( [0] => Yz. ) )
        ?>
    
    1. "." —— 匹配除换行符以外任意一个字符

    使用字符 ".",使用 "/" 转义

    1. * —— 匹配其前边字符,0次,或1次,或多次
        <?php
            $find = "/Yz*/";
            $str1 = "Yz,Yzz,Yzzzzzzzzzzzzzzzzzzzzzzzzzz,";
            $str2 = "yzYy";
            echo preg_match_all($find,$str1,$arr1);//3
            print_r($arr1);//Array ( [0] => Array ( [0] => Yz [1] => Yzz [2] => Yzzzzzzzzzzzzzzzzzzzzzzzzzz ) )
            echo preg_match_all($find,$str2,$arr2);//1
            print_r($arr2);//Array ( [0] => Array ( [0] => Y ) )
        ?>
    
    1. + —— 匹配一次或多次其前边的字符
        <?php
            $find = "/Yz+/";
            $str1 = "Yz,Yzz,Yzzzzzzzzzzzzzzzzzzzzzzzzzz,";
            $str2 = "yzYy";
            echo preg_match_all($find,$str1,$arr1);//3
            print_r($arr1);//Array ( [0] => Array ( [0] => Yz [1] => Yzz [2] => Yzzzzzzzzzzzzzzzzzzzzzzzzzz ) )
            echo preg_match_all($find,$str2,$arr2);//0
            print_r($arr2);//Array ( [0] => Array ( ) )
        ?>
    
    1. ? —— 匹配 0次或一次其前边的字符
        <?php
            $find = "/Yz?/";
            $str1 = "Yz,Yzz,Yzzzzzzzzzzzzzzzzzzzzzzzzzz,";
            $str2 = "yzYy";
            echo preg_match_all($find,$str1,$arr1);//3
            print_r($arr1);//Array ( [0] => Array ( [0] => Yz [1] => Yz [2] => Yz ) )
            echo preg_match_all($find,$str2,$arr2);//0
            print_r($arr2);//Array ( [0] => Array ( [0] => Y ) )
        ?>
    
    1. {n} —— 表示其前边字符出现的次数
        <?php
            $find = "/Yz{3}/";
            $str = "Yz,Yzz,Yzzz,Yzzzz";
            echo preg_match_all($find,$str,$arr);//2
            print_r($arr);//Array ( [0] => Array ( [0] => Yzzz [1] => Yzzz ) )
        ?>
    
    1. {n,} —— 表示其前面字符出现不少于n次
        <?php
            $find = "/Yz{3,}/";
            $str = "Yz,Yzz,Yzzz,Yzzzz";
            echo preg_match_all($find,$str,$arr);//2
            print_r($arr);//Array ( [0] => Array ( [0] => Yzzz [1] => Yzzzz ) )
        ?>
    
    1. {n,m} —— 表示其前面字符出现不少于n次,最多出现m次
        <?php
            $find = "/Yz{3,4}/";
            $str = "Yz,Yzz,Yzzz,Yzzzz,Yzzzzz";
            echo preg_match_all($find,$str,$arr);//3
            print_r($arr);//Array ( [0] => Array ( [0] => Yzzz [1] => Yzzzz [2] => Yzzzz ) )
        ?>
    
    1. ^ 或 \A —— 匹配字符串开始的位置,一般放在最前边
        <?php
            $find = "/^Y/";
            $str1 = "Yz";
            $str2 = "zYz";
            echo preg_match_all($find,$str1,$arr1);//1
            print_r($arr1);//Array ( [0] => Array ( [0] => Y ) )
            echo preg_match_all($find,$str2,$arr2);//0
            print_r($arr2);//Array ( [0] => Array ( ) )
        ?>
    
    1. $ 或 \Z —— 表示字符串的结束位置,一般放在最后边
        <?php
            $find = "/z$/";
            $str1 = "Yz";
            $str2 = "zYzY";
            echo preg_match_all($find,$str1,$arr1);//1
            print_r($arr1);//Array ( [0] => Array ( [0] => z ) )
            echo preg_match_all($find,$str2,$arr2);//0
            print_r($arr2);//Array ( [0] => Array ( ) )
        ?>
    
    1. | —— 匹配两个或多个模式
        <?php
            $find = "/Yz{5}|z{3,4}/";
            $str = "Yz,Yzz,Yzzz,Yzzzz,Yzzzzz";
            echo preg_match_all($find,$str,$arr);//3
            print_r($arr);//Array ( [0] => Array ( [0] => zzz [1] => zzzz [2] => Yzzzzz ) )
        ?>
    
    • —— 匹配方括号中的任意一个字符
        <?php
            $find = "/Y[z,s]/";
            $str = "Yz,Ys,Ya,Yb,Yc";
            echo preg_match_all($find,$str,$arr);//2
            print_r($arr);//Array ( [0] => Array ( [0] => Yz [1] => Ys ) )
        ?>
    
    1. [^] —— 匹配除了方括号中字符外的任意字符
        <?php
            $find = "/Y[^z,s]/";
            $str = "Yz,Ys,Ya,Yb,Yc";
            echo preg_match_all($find,$str,$arr);//3
            print_r($arr);//Array ( [0] => Array ( [0] => Ya [1] => Yb [2] => Yc ) )
        ?>
    
    1. () —— 将括号中的内容作为一个整体,方便将其内容获取到
        <?php
            $find = "/Y(z)/";
            $str = "Yz,Yzz,Yzzz,Yzzzz";
            echo preg_match_all($find,$str,$arr);//4
            print_r($arr);
            //Array ( [0] => Array ( [0] => Yz [1] => Yz [2] => Yz [3] => Yz ) [1] => Array ( [0] => z [1] => z [2] => z [3] => z ) )
        ?>
    

    可以使用 "\数字" 来匹配第几个括号,

    // \\2 等价于 (z)
    // \\1 等价于 (Y)
        <?php
            $find = "/(Y)(z)\\2\\2/";
            $str = "Yz,Yzz,Yzzz,Yzzzz";
            echo preg_match_all($find,$str,$arr);//
            print_r($arr);
            //Array ( [0] => Array ( [0] => Yzzz [1] => Yzzz ) [1] => Array ( [0] => Y [1] => Y ) [2] => Array ( [0] => z [1] => z ) )
        ?>
    //第一个数组表示匹配到的内容
    //第二个数组表示第一个括号每次匹配
    //第三个数组表示第二个括号每次匹配
    

    当括号(.)时,\n 所对应的字符 必须是 (.)在字符串中匹配的内容

        <?php
            $find = "/Y(.)\\1/";
            $str = "Yza,Yzs,Yzz";
            echo preg_match_all($find,$str,$arr);//1
            print_r($arr);//Array ( [0] => Array ( [0] => Yzz ) [1] => Array ( [0] => z ) )
        ?>
    

    练习使用

    1. 使用 .* ,贪婪匹配
        <?php
            $find = "/{.*}/";
            $str = "{name:'小明',class:1526}";
            echo preg_match_all($find,$str,$arr);//1
            print_r($arr);//Array ( [0] => Array ( [0] => {name:'小明',class:1526} ) )
        ?>
    

    匹配所有满足条件的内容

        <?php
            $find = "/{.*}/";
            $str = "{{name:'小明'},{class:1526}}";
            echo preg_match_all($find,$str,$arr);//1
            print_r($arr);//Array ( [0] => Array ( [0] => {{name:'小明'},{class:1526}} ) )
        ?>
    //直到匹配到最后一个 } ,忽略中间情况 
    
    1. 使用 .*? ,懒惰匹配
        <?php
            $find = "/{.*?}/";
            $str = "{{name:'小明'},{class:1526}}";
            echo preg_match_all($find,$str,$arr);//2
            print_r($arr);
            //Array ( [0] => Array ( [0] => {{name:'小明'} [1] => {class:1526} ) )
        ?>
    //匹配到最近一个 } ;
    

    模式修正符

    模式修正符

    1. i —— 在匹配时,不区分大小写
        <?php
            $find = "/Yz/i";
            $str = "yz,Yz,YZ";
            echo preg_match_all($find,$str,$arr);//3
            print_r($arr);//Array ( [0] => Array ( [0] => yz [1] => Yz [2] => YZ ) )
        ?>
    
    1. m —— 多行匹配

    使用条件:

    • 目标字符串包含 "\n",表示换行
    • 正则表达式必须出现 $
        <?php
            $find = "/Yz/m";
            $str1 = "Yz\nYz\nYz\n";
            $str2 = "Yz
                    Yz
                    Yz";
            echo preg_match_all($find,$str1,$arr1);//3
            print_r($arr1);//Array ( [0] => Array ( [0] => Yz [1] => Yz [2] => Yz ) )
            echo preg_match_all($find,$str2,$arr2);//3
            print_r($arr2);//Array ( [0] => Array ( [0] => Yz [1] => Yz [2] => Yz ) )
        ?>
    
    $str2 = "Yz
             Yz
             Yz";
    //这种格式会存在问题,有些系统不支持
    // Windows 操作系统中可以看到的换行时通过两个字符来完成的,(\r\n)
    //Linux操作系统中看到的换行就是由 \n 来完成的
    //
    
    1. s —— 若设定此修正符, "." 将匹配所有的符号,包括换行符
        <?php
            $find1 = "/Yz./";
            $find2 = "/Yz./s";
            $str = "yz,Yz\nYZ";
            echo preg_match_all($find1,$str,$arr);//0
            print_r($arr1);//Array ( [0] => Array ( ) )
            echo "<br>";
            echo preg_match_all($find2,$str,$arr);//1
            print_r($arr2);//Array ( [0] => Array ( [0] => Yz [1] => Yz [2] => Yz ) )
        ?>
    
    1. U —— 禁止贪婪匹配
        <?php
            $find = "/{.*}/U";
            $str = "{{name:'小明'},{class:1526}}";
            echo preg_match_all($find,$str,$arr);//2
            print_r($arr);//Array ( [0] => Array ( [0] => {{name:'小明'} [1] => {class:1526} ) )
        ?>
    
    1. e
    2. A
    3. D
    4. S
    5. u
    6. X
    7. J
    8. u

    正则表达式匹配的函数

    正则表达式匹配的函数

    preg_match()

    执行匹配正则表达式

    preg_match($find,$str,[$array],[flags],[offset])
    
    $find  表示 正则表达式
    $str  表示 给定的字符串
    $array 表示 查找到的字符串存储的数组
    flags 表示 设置标记值:
        PREG_OFFSET_CAPTURE —— 对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。
                                 也就是找到字符串的位置
    offst 表示 搜索从目标字符串开始的位置
    
    如果 offset 比 $str 的长度还要大则返回 FALSE。
    
        <?php
            $find = "/Y(.*?)z/";
            $str = "Yz,Yzz,Yzzz,Yzzzz,Yzzzzz";
            echo preg_match_all($find,$str,$arr);//5
            print_r($arr);
            //Array ( [0] => Array ( [0] => Yz [1] => Yz [2] => Yz [3] => Yz [4] => Yz ) [1] => Array ( [0] => [1] => [2] => [3] => [4] => ) )        echo preg_match($find,$str,$arr);//1
            echo preg_match($find,$str,$arr);//1
            print_r($arr);//Array ( [0] => Yz [1] => )
        ?>
    

    返回值:preg_match()返回 $find 的匹配次数。 它的值将是0次(不匹配)或1次,

        <?php
            $find = "/Y(.*?)z/";
            $str = "Yz,Yzz,Yzzz,Yzzzz,Yzzzzz";
            echo preg_match($find,$str,$arr,PREG_OFFSET_CAPTURE,5);//1
            print_r($arr);//Array ( [0] => Array ( [0] => Yz [1] => 7 ) [1] => Array ( [0] => [1] => 8 ) )
        ?>
    //数组匹配到的位置,匹配数组的第二个参数
    

    因为preg_match()在第一次匹配后 将会停止搜索。

    preg_match_all()

    按照指定的正则表达式,在给定的字符串内进行搜索,匹配到符合特征的部分取出

    preg_match_all($find,$str,[$array],[flags],[offset])
    
    $find  表示 正则表达式
    $str  表示 给定的字符串
    $array 表示 查找到的字符串存储的数组
    flags 表示 设置标记值:
        PREG_PATTERN_ORDER —— 默认使用次排序标记
        PREG_SET_ORDER —— matches[0]包含第一次匹配得到的所有匹配(包含子组),以此类推
        PREG_OFFSET_CAPTURE ——对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。
                                 也就是找到字符串的位置 
    offst 表示 搜索从目标字符串开始的位置
    
    如果 offset 比 $str 的长度还要大则返回 FALSE。
    

    返回值:int,查找的个数

        <?php
            $find = "/Yz/";
            $str = "YZZyzyYzzYz";
            echo preg_match_all($find,$str,$arr);//2
            print_r($arr);//Array ( [0] => Array ( [0] => Yz [1] => Yz ) )
        ?>
    

    preg_replace

    执行一个正则表达式的搜索和替换

    preg_replace($find,$replace,$str,[limit],[count])
    
    $find  表示 正则表达式
    $replace 表示 替换用的字符串
    $str  表示 给定的字符串
    limit 表示 设置替换的最大次数,默认为-1,无限次
    count 表示 完成的替换次数。
    

    返回值:若$str为数组,则返回一个数字,其他情况下返回一个字符串

    注意:不能使用模式修正符\e,否则会产生一个 E_DEPRECATED 错误

        <?php
            $find = "/<b>(.*?)<\/b>/";
            $replace = "<b>这个加粗显示了</b>";
            $str = "<p><b>加粗显示</b>正常显示<b>加粗显示</b></p>";
            echo preg_replace($find,$replace,$str,-1,$count);//这个加粗显示了正常显示这个加粗显示了
            echo $count;//2
            echo preg_replace($find,$replace,$str,0);//加粗显示正常显示加粗显示
            echo preg_replace($find,$replace,$str,1);//这个加粗显示了正常显示加粗显示
        ?>
    
        <?php
            $find = "/<b(.*?)>(.*?)<\/b>/";
            $replace = "<b$1>$2</b>";
            $str = "<p><b style='color:red;'>加粗显示</b>正常显示<b style='color:green;'>加粗显示</b></p>";
            echo preg_replace($find,$replace,$str,-1,$count);//这个加粗显示了正常显示这个加粗显示了
        ?>
    

    可以看出1对应第一个括号的内容,2匹配第二个括号的内容,每匹配一次替换一次

    find 与replace 为数组,必须 一 一 对应

        <?php
            $find = ["/<b(.*?)>(.*?)<\/b>/","/<i(.*?)>(.*?)<\/i>/"];
            $replace = ["<b$1>我红了</b>","<i$1>我绿了</i>"];
            $str = "<p><b style='color:red;'>加粗显示</b>正常显示<i style='color:green;'>倾斜显示</i></p>";
            echo preg_replace($find,$replace,$str);//我红了正常显示我绿了
        ?>
    

    相关文章

      网友评论

          本文标题:PHP基础 —— 正则表达式

          本文链接:https://www.haomeiwen.com/subject/dshxkktx.html