php 正则匹配小括号内容的问题

目标:匹配jpg和png格式的图片。并且只匹配一次就好。

含有图片地址的字符串如下:

$str = string(156) "a:3:{i:0;s:38:"uploads/image/20210907/1631007647.jpg,";i:1;s:38:"uploads/image/20210907/1631016620.jpg,";i:2;s:38:"uploads/image/20210907/1631014044.jpg,";}"

第一种:使用(jpg|png)来选择匹配图片格式

preg_match_all("#uploads/image/[0-9]+\/[0-9]+\.(jpg|png)#", $str, $match);

  $i = 1;
  foreach ($match as $item1) {
    echo "{$item1}<br>";
    foreach ($item1 as $item_i) {
      echo "{$item_i}----{$i}<br>";
      $i++;
    }
  }

##备注:
1.定界符我是用#,使用“/”做定界符时,汇报错的。
2、preg_match_all:一直匹配到字符串的最后。
2、preg_match: 只匹配一次就停止后面的匹配了。

匹配结果如下:匹配了一次整体结果后。又匹配了一次小括号(jpg|png)的内容了。

Array
uploads/image/20210907/1631007647.jpg----1
uploads/image/20210907/1631016620.jpg----2
uploads/image/20210907/1631014044.jpg----3
Array
jpg----4
jpg----5
jpg----6

第二种:使用 【jpg|png】来选择匹配图片格式

注意:这里时候两个【】来匹配 jpg和png前面两个不同的字符,且对应位置。

preg_match_all("#uploads/image/[0-9]+\/[0-9]+\.[j|p][p|n]g#", $row['picarr'], $match);
  
  $i = 1;
  foreach ($match as $item1) {
    echo "{$item1}<br>";
    foreach ($item1 as $item_i) {
      echo "{$item_i}----{$i}<br>";
      $i++;
    }
  }

匹配结果如下:我们看到结果就不会匹配第二次了。

Array
uploads/image/20210907/1631007647.jpg----1
uploads/image/20210907/1631016620.jpg----2
uploads/image/20210907/1631014044.jpg----3

综上得知:

1、使用(jpg|【png)匹配。由于()会把小括号的内容当成了一个单独的组。因此在匹配完外面整体之后,再对这个分组进行二次匹配。

2、使用【】匹配。一个【】,只能匹配【】中的一个字符。因此匹配两个不同字符时,需要使用两个【】。

知识补充:

一、括号字符()的作用:

(1)第一个作用就是可以改变限定符的作用范围,如“|”、“*”、“^”等。

(2)第二个作用就是分组,也就是子表达式。如 (\.[0-9]{1,3}){2},就是对分组(\.[0-9]{1,3})进行重复匹配操作。

二、中括号【】的作用:

教材中这个括号是字符类。只要匹配的字符出现在方括号内,即可表示匹配成功。但是一个方括号只能匹配一个字符。因此在在匹配jpg和png三个字符时,需要使用两个【】来匹配前面两个不同的字符。第三个字符都是相同的“g”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值