10.正则表达式

10.正则表达式-四曲博客
10.正则表达式
此内容为免费阅读,请登录后查看
0
免费阅读

正则表达式简介

  • 正则表达式的处理函数

image-20201028101815422

  • 表达式应该被包含在定界符中,如反斜杠“/”定界符

正则表达式的语法规则

原子

  1. 普通字符作为原子

    '/5/'      #用5来作为原子
    
    '/php/'        #用php来作为原子进行匹配
  2. 一些特殊字符和元符号作为原子:对于一些有特殊意义的字符,需要使用“\”转义字符

  3. 非打印字符作为原子

image-20201028102711586

  1. 使用通用字符作为原子

image-20201028102800732

  1. 自定义原子表

    • 在某些情况下,通用字符不能代表所有的匹配类型,因此,就需要我们自定义原子表,使用"[]"来自定义一组类型
    • 还可以使用"[^]"来匹配除了表以外的任意字符
    • 还可以使用“-”来进行连接一组按照ASCLL码顺序排列的原子,来进行一类匹配
    '/[abc]jsp/' #匹配ajsp,bjsp,cjsp
    '/[^abc]jsp/'    #除了ajsp,bjsp,cjsp的其他字符,比如:djsp,ejsp等等
    '/[0-9]/'        #匹配0-9的数字,相当于\d
    

有特殊功能的字符

元字符

元字符不能单独出现,必须修饰原子,如果要匹配元字符本身,则要加上“\”进行转义

image-20201028103806110

image-20201028103826544

  • 限定符

image-20201028104340585

  • 边界限制

image-20201028104406341

  • 句号:在字符类之外,模式中的圆点可以匹配目标中的任何一个字符,包括不可打印字符
'a.b' #匹配a和b之间任意有效的字符,比如:acb,axb,arb等等
  • 模式选择符:匹配两个或者更多的选择之一
'/a|b/'   #匹配a字符或b字符
'/a|b|c/' #匹配a字符或b字符或c字符
  • 模式单元:使用“()”进行包括,把包裹中的内容当成一个原子
'/(yes )*good/'   #匹配good、yes good、yes yes good等等
  • 后向引用:使用“()”包裹起来的表达式,能够存储在缓冲区中,在后面的表达式中可以使用“\\1”、“\\2”、“\\3”来进行引用
  • 正则表达式的优先级:从左往右进行计算

image-20201028111650531

模式修正符

  • 模式修正符在定界符之外进行使用,可以修正对正则表达式的解释,扩展了正则表达式在匹配、替换等操作时的某些功能

image-20201028112009339

'/php/i'  #在匹配时不区分大小写
'/ph p/ix'    #忽略空白和不区分大小写

与Perl兼容的正则表达式函数

函数:preg_match()

image-20201028112444685

  • 第一个参数:为正则表达式文本
  • 第二个参数:要匹配的字符
  • 第三个参数:可选参数,用于获得包含了第一参数子模式匹配的各个部分的结果,子模式用“()”进行包裹,matches[0]包含了正则表达式pattern的整体结果,而matches[1]则保存了第一个子模式匹配的结果,以此类推。
  • 该函数只匹配一次,并且返回0或1的匹配结果数
<?php
    $pattern='/(https?|ftp?):\/\/([^\.]+).(com|org|cn|xyz)/';
    $string="我的网址是https://siqulab.cn,四曲博客";
    $array=array();
    preg_match($pattern,$string,$array);
    echo "匹配结果:".$array[0]."<br/>";
    echo "协议:".$array[1]."<br/>";
    echo "域名:".$array[2].".".$array[3];
// 运行结果:
// 匹配结果:https://siqulab.cn
// 协议:https
// 域名:siqulab.cn
?>  

函数:preg_match_all()

image-20201028114144633

  • 该函数与preg_match()的用法一致,不同的是,它不止匹配一次,而是匹配到文本底部
  • 第四个参数有两个预定义的值:
    • PREG_PATTERN_ORDER:默认参数,对结果使用matches[0]全部模式匹配的数组,对matches[1]第一个子匹配的数组
    • PREG_SET_ORDER:matches[0]为第一组结果,matches[1]为第二组结果,以此类推
<?php
    $pattern='/(https?|ftp?):\/\/([^\.\/]+).(com|org|cn|xyz|work)/';
    $string="我的网址是https://siqulab.cn,四曲博客:https://hecloud.work";

    #开始匹配
    preg_match_all($pattern, $string, $array,PREG_SET_ORDER);

    #输出结果
    for($i=0;$i<count($array);$i++){    #匹配到两个结果,因此循环两次
        echo "第".$i."个网址为:".$array[$i][0]."<br/>";
        echo "协议:".$array[$i][1]."<br/>";
        echo "域名:".$array[$i][2].".".$array[$i][3];
        echo "<br/><br/>";
    }

// 运行结果:
// 第0个网址为:https://siqulab.cn
// 协议:https
// 域名:siqulab.cn

// 第1个网址为:https://hecloud.work
// 协议:https
// 域名:hecloud.work
?>  

函数:preg_grep()

image-20201028215546877

  • 第一个参数,要匹配的模式,也就是正则表达式
  • 第二个参数为输入数组,对输入数组当中的每个元素,只进行一次匹配

字符处理函数

  • strstr()或者strpos()函数,查找某个字符串中是否包含某个字符串
  • substr()函数,搜索一个字符串在另一个字符串当中的第一次出现,该函数返回字符串的其余部分,如未找到,则返回false,第一个参数是提供被搜索的字符串,第二个参数为所搜索的字符串
    • strpos(),返回字符串在另一个字符串中第一次出现的位置,如果没有找到,则返回false

字符串的替换

  • preg_replace()

image-20201028220400923

​ 该函数会在第三个参数subject中搜索第一个参数所匹配的匹配项,并用第二个参数当中的内容进行替换,第四个参数是可选参数,则仅替换limit个匹配,如果省略或其数值为-1,则所有的匹配项都会被替换

​ 该函数的逆向引用,最好不要采用“\\n”的形式,最好采用\${n}的形式进行逆向引用

<?php
    $pattern='/([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{4})/';
    $string="你好12/3/2012,这是一个日期";
    echo preg_replace($pattern,"\${3}-\${1}-\${2}",$string);    //使用\${n}的方式进行向后引用

// 运行结果:
// 你好2012-12-3,这是一个日期
?>  
  • str_replace()

image-20201028224831194

  1. 第一个参数为目标对象
  2. 第二个参数为替换对象
  3. 第三个参数subject则是被处理的对象
  4. 第四个参数可选,表示被替换的次数
  5. 该函数返回被替换的字符串
  6. 第一个字符串和第二个字符串都可以为数组
<?php
    $array=array("a","b","c");
    echo str_replace($array,"", "abcd");    #用第一个参数中的每个元素对第三个参数进行匹配

#将第三个参数中含有a、b、c三个字符的位置替换为空
// 输出结果:
// d
?>  
  1. 如果第一个和第二个都是字符串,则会进行对应位置的替换
<?php
    $array=array("a","b","c");
    $array_1=array("d","e","f");
    echo str_replace($array,$array_1, "abcd");    #用第一个参数中的每个元素对第三个参数进行匹配
// 运行结果:
// defd
?>  

字符串的分割和链接

  • 函数preg_split()

image-20201028232935649

  1. 如果指定了limit参数,则至多返回limit个子字符串
  2. 第四个参数:

image-20201028233046773

<?php
    var_dump(preg_split("/[\s,]+/", "hello,siqu"));
    echo "<br/>";

    #使用偏移量,偏移量即为输出结果第一字符在原字符的位置
    $array=preg_split("/[\s,]+/", "hello,siqu",-1,PREG_SPLIT_OFFSET_CAPTURE);

    #打印结果
    for ($i=0;$i<count($array);$i++){
        echo "结果为:".$array[$i][0]."<br/>";
        echo "偏移量:".$array[$i][1]."<br/>";
    }

// 运行结果:
// array(2) { [0]=> string(5) "hello" [1]=> string(4) "siqu" }
// 结果为:hello
// 偏移量:0
// 结果为:siqu
// 偏移量:6
?>  
  • 函数explode()

image-20201028234924979

  1. 第一个参数为分割字符
  2. 第二个参数要分割的字符串
  3. 第三个参数可选,表示要返回多少个子串
  4. 成功返回字符串,否则返回false
<?php
    $array=explode(",", "hello,siqu");
    var_dump($array);

// 运行结果:
// array(2) { [0]=> string(5) "hello" [1]=> string(4) "siqu" }
?>  
  • 函数implode()

image-20201028235253282

  1. 该函数用于将数组pieces中的每个元素使用glue链接起来,并且组合成一个字符串
<?php
    $array=array("yes","no");
    echo implode("+", $array);
// 运行结果:
// yes+no
?>  
© 版权声明
THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
四曲的头像-四曲博客

昵称

取消
昵称表情代码图片