PHP7语言基础——字符串和正则表达式(下)

本文深入解析正则表达式的概念、语法与应用场景,涵盖匹配、查找、替换及分割等核心功能,适合初学者和进阶者提升技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正则表达式

什么是正则表达式

正则表达式也称为模式表达式,它自身具有一套非常完整的、可以编写模式的语法体系,提供了一种灵活且直观字符串传力方法。正则表达式通过构建具有特定规则的模式,与输入字符串信息进行比较,在特定的函数中使用,从而实现字符串的匹配、查找、替换及分割等操作。

正则表达式语法规则

正则表达式组成:定界符+原子+元字符+模式修正符。

定界符:就是确定正则表达式(规则表达式)的边界的符号。PHP中可以使用’/ 正则表达式 /'来定界,即将模式包含在两个反斜线“/”之间。

原子:原子是正则表达式最进本的组成单位,每个模式中最少要包含一个原子。

  • 普通字符作为原子
    包括所有大小写字母、数字等。
  • 一些特殊字符作为原子
    任何一个符号都可以作为原子使用,但如果这个符号在正则表达式中有一些特殊的意义,就必须使用转义字符“\”取消它的特殊意义,将其变成一个普通的原子。
  • 一些非打印字符作为原子
      所谓非打印字符,是一些在字符串中的格式控制符号,如空格、回车及制表符等。

元字符:具有特殊含义的字符,用于修饰原子。在一个正则表达式中,元字符不能单独出现,它必须用来修饰原子。

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

元字符的含义说明

  1. 行定位符(^与$)
    行定位符是用来描述字符串的边界。“$”表示行结尾,“^”表示行开头。如"^de"表示以de开头的字符串,“de$”表示以de结尾的字符串。

  2. 单词定界符
    当我们查找一个单词的时候,不希望这个单词匹配到另一个单词的一部分,如要在字符串“an apple under the desk"中查找an,我们希望找到的是an而不是and,此时就需要用到单词定界符\b。用\ban\b去匹配,就只能匹配到an了。还有一个大写的\B,意思和\b刚好相反,它匹配的字符串不能是一个完整的单词,只能是其他单词的一部分。

  3. 选择字符(|)
    选择字符(|)表示或,如a|b表示a或者b的意思。需要注意的是使用“[]”与“|”的区别,“[]”只能匹配单个字符,而“|”可以匹配任意长度的字符串。“[]”往往配合连字符一起使用,如[a-z],代表a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z。

  4. 排除字符(^)
    表示排除不符合的字符,排除字符一般放在“[]”中,如[^1-5],表示字符不是1-5之间的数字。

  5. 限定符(? ,*, +,{n,m})
    限定符主要用来限定每个字符串出现的次数。

    限定字符含义
    零次或一次
    *零次或多次
    +一次或多次
    {n}n次
    {n,}至少n次
    {n, m}n到m次

    如(D+)表示一个或多个D

  6. 点号操作符
    匹配任意字符(不包含换行符)

  7. 反斜杠(\)字符

    正则表达式中的反斜杠有多重意义,如转义、指定预定义的字符集、定义断言、显示不打印的字符等。

    • 转义字符
      转义字符主要是将一些特殊字符转为普通字符。而这些常用特殊字符有"."、“?”、“\”等。

    • 指定预定义的字符集

      字符含义
      \d任意一个十进制数字,[0-9]
      \D任意一个非十进制数字
      \s任意一个空白字符(空格、换行符、换页符、回车符、制表符)
      \S任意一个非空白字符
      \w任意一个单词字符
      \W任意一个非单词字符
    • 显示不可打印的字符

      字符含义
      \a报警
      \b退格
      \f换页
      \n换行
      \r回车
      \t制表符
  8. 括号字符()
    在正则表达式中小括号的作用主要有:

    • 改变限定符如(|、*、^)的作用范围。
    • 进行分组,便于反向引用
  9. 反向引用
    反向引用,就是依靠子表达式的“记忆”功能,匹配连续出现的字符串或是字符。对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,可以被获取供以后使用。如(dqs)(pps)\1\2,表示匹配字符串dqsppsdqspps。当需要使用模式单元而又不想存储匹配结果时,可以使用非捕获元字符“?:”、“?=”或“?!”来忽略对相关匹配的保存。

  10. 模式修饰符
    模式修饰符的作用是设定模式,也就是正则表达式如何解释。PHP中主要模式如下:

    修饰符说明
    i忽略大小写
    m多文本模式
    s单行文本模式
    x忽略空白字符
  11. 连字符(-)
    在[]中使用连字符“-”指定字符的区间。

正则表达式函数

正则表达式不能独立使用,它只是一种用来定义字符串的规则模式,必须在相应的正则表达式函数中应用,才能实现对字符串的匹配、查找、替换及分割等操作。

  1. 字符串的匹配与查找

    1. preg_match函数
      执行匹配正则表达式。

      说明:

      preg_match(string $pattern, string $subject[, array &$matches[, int $flag[, int $offset=0]]]):int
      

      搜索subjectpattern给定的正则表达式的匹配。

      参数:

      pattern:要搜索的模式,字符串类型。
      subject:输入字符串。
      matches:如果提供了参数matches它将被填充为搜索结果。 matches[0]包含完整模式匹配到的文本, matches[1]将包含第一个捕获子组匹配到的文本,以此类推。
      flags:可以被设置为以下 标记值:

      • PREG_OFFSET_CAPTURE:如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。注意:这会改变填充到matches参数的数组,使其每个元素成为一个由第0个元素是匹配到的字符串,第1个元素是该匹配字符串在目标字符串subject中的偏移量。

      offset:通常,搜索从目标字符串的开始位置开始。可选参数 offset 用于指定从目标字符串的某个位置开始搜索(单位是字节)。

      返回值:

      返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索。

    2. preg_match_all函数

      执行一个全局正则表达式匹配。该函数与preg_match()类似,不同的是函数preg_match()在第一次匹配之后就会停止搜索,而函数preg_match_all()则会一直搜索到指定字符串的结尾,可以获取所有匹配到的结果。

      说明:

      preg_match_all(string $pattern, string $subject[, array &$matches[, $flags=PREG_PATTERN_ORDER[, int $offset=0]]]):int
      

      搜索subject中所有匹配pattern给定正则表达式 的匹配结果并且将它们以flag指定顺序输出到matches中。在第一个匹配找到后, 子序列继续从最后一次匹配位置搜索。

      参数:

      pattern:要搜索的模式,字符串形式。
      subject:输入字符串。
      matches:多维数组,作为输出参数输出所有匹配结果, 数组排序通过flags指定。

      flags:可以结合下面标记使用(注意不能同时使用PREG_PATTERN_ORDER和 PREG_SET_ORDER):

      • PREG_PATTERN_ORDER:结果排序为$matches[0]保存完整模式的所有匹配, $matches[1]保存第一个子组的所有匹配,以此类推。如果正则表达式包含了带名称的子组,$matches 额外包含了带名称子组的键。
      • PREG_SET_ORDER:结果排序为$matches[0]包含第一次匹配得到的所有匹配(包含子组),$matches[1]是包含第二次匹配到的所有匹配(包含子组)的数组,以此类推。
      • PREG_OFFSET_CAPTURE:如果这个标记被传递,每个发现的匹配返回时会增加它相对目标字符串的偏移量。注意这会改变matches中的每一个匹配结果字符串元素,使其成为一个第0个元素为匹配结果字符串,第1个元素为匹配结果字符串在subject中的偏移量。

      offset:通常, 查找时从目标字符串的开始位置开始。可选参数offset用于从目标字符串中指定位置开始搜索(单位是字节)。

      返回值:

      返回完整匹配次数(可能是0),或者如果发生错误返回**FALSE**。

    3. preg_grep函数
      返回匹配模式的数组条目。用于匹配数组中的元素,返回与正则表达式匹配的数组单元。

      说明:

      preg_grep(string $pattern, array $input[, int $flags=0]):array
      

      返回给定数组input中与模式pattern 匹配的元素组成的数组.。

      参数:

      pattern:要搜索的模式,字符串形式。
      input:输入数组。
      flags:如果设置为PREG_GREP_INVERT, 这个函数返回输入数组中与给定模式pattern不匹配的元素组成的数组.

      返回值:

      返回使用input中key 做索引的数组。

  2. 字符串的替换

    1. preg_replace()函数
      执行一个正则表达式的搜索和替换。

      说明:

      preg_replace(mixed $pattern, mixed $replacement, mixed $subject[, int $limit=-1[, int &$count]]):mixed
      

      在第三个参数subject中搜索第一个参数pattern模式的匹配项,并替换为第二个参数replacement。

      参数:

      pattern:要搜索的模式。可以使用一个字符串或字符串数组。
      replacement:用于替换的字符串或字符数组。如果这个参数是一个字符串,并且pattern是一个数组,那么所有的模式都使用这个字符串进行替换。如果patternreplacement都是数组,每个pattern使用replacement中对应的元素进行替换。如果replacement中的元素比pattern中的少,多出来的pattern使用空字符串进行替换。replacement中可以包含后向引用\\n$n,语法上首选后者。 每个这样的引用将被匹配到的第n个捕获子组捕获到的文本替换。 n 可以是0-99,\\0$0代表完整的模式匹配文本。捕获子组的序号计数方式为:代表捕获子组的左括号从左到右, 从1开始数。如果要在replacement中使用反斜线,必须使用4个("\\\\",因为这首先是php的字符串,经过转义后,是两个,再经过正则表达式引擎后才被认为是一个原文反斜线)。
      subject:要进行搜索和替换的字符串或字符串数组。如果subject是一个数组,搜索和替换会在subject的每一个元素上进行,并且返回值也会是一个数组。
      limit:每个模式在每个subject上进行替换的最大次数。默认是-1(无限)。
      count:如果指定,将会被填充为完成的替换次数。

      返回值:

      如果subject是一个数组,该函数返回一个数组,其他情况下返回一个字符串。如果匹配被查找到,替换后的subject被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回 NULL

    2. preg_replace_callback函数
      执行一个正则表达式搜索并且使用一个回调进行替换。

      说明:

      preg_replace_callback(mixed $pattern, callable $callback, mixed $subject[, int $limit=-1[, int &$count]]):mixed
      

      这个函数的行为除了 可以指定一个 callback 替代 replacement 进行替换 字符串的计算,其他方面等同于 preg_replace函数。

      参数:

      pattern:要搜索的模式。可以使用一个字符串或字符串数组。
      callback:一个回调函数,在每次需要替换时调用,调用时函数得到的参数是从subject 中匹配到的结果。回调函数返回真正参与替换的字符串。
      subject:要搜索替换的目标字符串或字符串数组。
      limit:每个模式在每个subject上进行替换的最大次数。默认是-1(无限)。
      count:如果指定,将会被填充为完成的替换次数。

      返回值:

      如果subject是一个数组,该函数返回一个数组,其他情况下返回一个字符串。如果匹配被查找到,替换后的subject被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回 NULL

  3. 字符串分割
    preg_split函数
    通过一个正则表达式分隔字符串。

    说明:

    preg_split(string $pattern, string $subject[, int $limit=-1[, int $flags=0]]):array
    

    该函数返回一个字符串数组,数组中的元素包含通过第二个参数subject中的字符串,经第一个参数的正则表达式pattern,作为匹配的边界所分割的子串。

    参数:

    pattern:用于搜索的模式,字符串形式。
    subject:输入字符串。
    limit:如果指定,将限制分割得到的子串最多只有limit个,返回的最后一个子串将包含所有剩余部分。limit值为-1, 0或null时都代表"不限制",作为php的标准,你可以使用null跳过对flags的设置。
    flags:可以是任何下面标记的组合(以位或运算 | 组合):

    • PREG_SPLIT_NO_EMPTY:如果设定此标记,则只返回非空部分。
    • PREG_SPLIT_DELIM_CAPTURE:如果设定了此标记,则定界符模式中的括号表达式也会被捕获并返回。
    • PREG_SPLIT_OFFSET_CAPTURE:如果设定了此标记,则对每个出现的匹配结果也同时返回其附属的字符串偏移量。

    返回值:

    返回一个使用pattern边界分隔 subject 后得到 的子串组成的数组, 或者在失败时返回 FALSE

  4. 正则表达是转义
    preg_quote函数
    转义正则表达式字符。

    说明:

    preg_quote(string $str[, string $delimiter=NULL]):string
    

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

    参数:

    str:输入字符串。
    delimiter:如果指定了可选参数delimiter它也会被转义。这通常用于转义PCRE函数使用的分隔符。

    返回值:

    返回转义后的字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值