PHP中的正则表达式

概述

  1. 正则表达式,就是一个匹配的 模式
  2. 正则表达式,就是一个字符串(其中有一些语法规则,特殊字符)。
  3. 正则表达式这个字符串,一定要在对应的函数中使用。(分割的函数,替换的函数)

组成

  1. 定界符

    定界符号可以使用多种符号,常用为 //

  2. 原子

    原子是最少的一个匹配单位,在一个正则表达式中,至少要有一个原子(写在定界符中)。

    1. 常见原子

      \d 代表任意一个数字 。 例如:0-9

      \D 代表任意一个非数字,也就是除了 0-9 之外的所有字符,等同于 ·[^0-9]

      \w 代表任意一个字 。例如:a-z、A-Z、0-9、_

      \W 代表任意一个非字,也就是除了 a-z、A-Z、0-9、_ 之外的所有字符

      \s 代表空白。例如:空格、回车、换行、tab。

      \S 代表非空白,也就是除了 空格、回车、换行、tab之外的字符。

    2. 自定义原子表 []

      [0-9] 代表匹配所有数字

      [a-z] 代表匹配小写字母 a 到字母 z

      [A-Z] 代表匹配大写字母 A 到字母 Z

      [a-zA-Z] 代表匹配所有字母

      [^a-zA-Z] 代表匹配除了字母以外的字符。在[]内才是排除的意思。 - 表示从哪到哪区间范围 ^ 表示列表中的

    3. 匹配所有 .

  3. 元字符

    元字符不能在正则表达式中单独使用,修饰原子,是用来扩展原子功能和限定原子功能的(写在定界符中)。

    * 用来修饰 其前面的原子 可以出现 0个 1个多个(任意次) 等价于 {0,}

    + 用来修饰 其前面的原子 可以出现 1次多次,不能没有,至少要出现一次。 等价于 {1,}

    ? 用来修饰 其前面的原子 可以出现 0次1次。等价于 {0,1} (可以取消贪婪模式)

    {m} 用来修饰 其前面的原子 只能出现 m 次,多一次和少一次都不行。

    {n,m} 用来修饰 其前面的原子 出现个数在 nm 之间,包括 nm

    {n,} 用来修饰 其前面的原子 出现的次数至少 n 次。

    | 是或的关系,表示它两边的原子,只要有一个出现就可以,但是,|优先级是最低的,所以常加括号来提升优先级。

    ^\A 表示必须以什么开始,这个必须写在正则表达式的最前面。

    $\Z 表示必须以什么结束,这个必须写在正则表达式的最后面。

    \b 单词边界

    //根据className获取元素(根据类名来获取元素)
    function getClass(oParent, sClass) {
        var aEle = oParent.getElementsByTagName('*');
        var reg = new RegExp( '\\b' + sClass + '\\b', 'i' );
        var res = [];
    
        for(var i=0;i<aEle.length;i++) {
            if( reg.test(aEle[i].className) ) {
                res.push( aEle[i] );
            }
        }
    
        return res;
    }
    

    \B 非单词边界

    () 括号 ★★★★★

    • 作用一:改变优先级别

    • 作用二:将小原子,变成大原子

    • 作用三:子模式,整个表达式是一个大的模式,小括号中是每个独立的子模式。

    • 作用四:反向引用。

      • \1表示第一个子模块 (子模式)
      • \2表示第二个子模块 (子模式)
      • \3表示第三个子模块 (子模式)
    • 如果我们出现了2个括号,但是第一个括号不是子模式,也可以去掉子模式,使用 ?:

      $str = "2019-01-28";
      $reg = '/\d{4}(-|\/)\d{2}\1\d{2}/';   	//第一个括号是子模式
      $reg = '/(?:\d{4})(-|\/)\d{2}\1\d{2}/';	//第一个括号不是子模式,使用 `?:` 来去掉子模式
      

    PS:在双引号中,反引号 \ 是属于转义字符,所以需要再进行转义,去掉它的意义。

  4. 模式修正符

    1. 概述

      1. 模式修正符是对模式(正则)进行修正使用的(写在定界符外,在右边)。
      2. 模式修正符,一个字符就是一个功能,可以组合使用。
    2. 作用

      模式修正符可以修正正则表达式的解释,或扩充了正则表达式的功能。

    3. 修正符号

      i 修正正则表达式不区分大小写(默认是区分大小写)

      m 修正正则表达式可以视为多行,在使用 ^$ 这两个符号时,每一行满足都可以。(默认视为一行处理)

      $single _str = "this is a test";  //没有回车(单行)
      
      $multi_str = "this is a test
      but this content is larger
      and so on...";					//有回车 (多行)
      
      // 一个字符串默认就算有回车也是一行,但 m 这个模式修正符可以把回车也视为一行
      

      s 修正正则表达式中的 . 可以匹配换行符。(默认匹配不了换行符)

      $str = "th
      is is a test";
      $reg = '/this/s';	//可以忽略换行匹配到this
      

      x 修正正则表达式中,可以忽略空白。

      $str = "this is a test web server";
      $reg = '/webserver/x';	//可以忽略 web server 中的空白,匹配到 web server
      

      e 在执行字符串替换的时候,执行字符串中的函数。

      $str = "http://www.baidu.com";
      $rules = '/(http:\/\/www)\.(.*?)\.(com)/e';
      echo preg_replace( $rules, "strtoupper('$1.$2.$3')", $str );  //输出 HTTP://WWW.BAIDU.COM
      

      U 解除贪婪模式匹配,但是一般不这样用,因为其他语言没有这样用法,那怎么解除贪婪呢?可以使用 (.*?) 或 (.+?) 解除贪婪。

      //需求:匹配 b 标签中的内容
      $str = "this <b>is</b> a test <b>web</b> server";
      $reg = '/\<b\>(.*)\<\/b\>/is';	//匹配 b 标签中的内容,b 标签可以没有内容也能匹配。此时的匹配结果为<b>is</b> a test <b>web</b>太贪婪
      $reg = '/\<b\>(.*?)\<\/b\>/is'; //可以解除贪婪
      

正则表达式的编写

  1. 正则表达式就是一门语言,把开发思想放进去。
  2. 列需求,一条一条满足,需求越详细,写的时候越方便。

相关函数

匹配查找

  1. preg_match — 执行一个正则表达式匹配(匹配第一个满足条件的)
  2. preg_match_all — 执行一个全局正则表达式匹配(匹配全部满足条件的)
  3. preg_grep — 在数组中搜索包含指定值的元素,返回一个新数组(符合条件的匹配结果)

分割

  1. preg_split — 通过一个正则表达式分隔字符串

替换

  1. preg_replace — 执行一个正则表达式的搜索和替换
  2. preg_filter — 执行一个正则表达式搜索和替换

其他

  1. preg_replace_callback — 执行一个正则表达式搜索并且使用一个回调进行替换

    // 需求:让年份加1
    $str = '2019-02-12';
    $reg = '/(\d{4})(-\d{2}-\d{2})/';
    function myfn( $matches ) {
    	return ($matches[1]+1) . $matches[2];
    }
    echo preg_replace_callback($reg, 'myfn', $str);
    /*
     * 正则表达式中的括号(),可以变成子模式。 
     */
    
  2. preg_replace_callback_array — Perform a regular expression search and replace using callbacks

  3. preg_quote — 转义正则表达式字符

常用匹配格式

  1. 匹配html标签。

    $reg = '/\<[\/\!]*?[^\<\>]+?\>/is';
    
  2. 匹配URL。

    $reg = '/([https?ftps?]):\/\/(www|mail|bbs|ftp)\.(.*?)\.(net|org|com|cn)([\w-\.\/\=\?\&\%]*)?/';
    

扩展PHP收集函数参数

$args = func_get_args();
//返回值是一个数组,数组中储存了参数列表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值