这次的需求是获取到一段html代码,这段代码里面含有多个img标签。需求就是先获取到这些img标签的src属性,然后进行业务编写。业务编写之后,把新的src内容分别替换到不同的img标签中。这部分逻辑听起来很简单,但实际操作还是有点难度,下面说一下解题过程。

实现过程

  • 获取到一段html代码中所有img标签的src属性

      preg_match_all('/<img[^>]*?src="([^"]*?)"[^>]*?>/i',$content,$match);
      $srcArr = $match[1];

    这里是利用正则匹配,$content是我们要提取的html代码,$match是获取到的数组。大家可以打印一下,$srcArr就是获取到的所有src属性的数组。这里可以通过循环来处理我们的逻辑。

    • 当处理完逻辑之后,我们需要再把处理后的src分别赋值给每个img标签
       $rules = '#<img(.+?)src="([^"]+?)"([^>]*?)>#';
       preg_replace($rules,"<img$1src=\"$base64\"$3>",$content);

这里还是使用正则匹配,但是如果按这种方式匹配的话,我们会把所有的img标签的src属性替换成$base64,这显然不是我们想要的结果。

  • 最终方案

      //申明正则匹配规则
     $rules = '#<img(.+?)src="([^"]+?)"([^>]*?)>#';
     //这里是循环,通过循环来匹配相应的img标签
     for($i=0;$i<$count;$i++) {
    //关键就是这个preg_replace_callback函数,它比着传统的正则替换,多了一个callback函数,可以让我们写自己的逻辑,use()里面是我们需要用到的参数
       $newContent =  preg_replace_callback('#<img(.+?)src="([^"]+?)"([^>]*?)>#', function($m) use($id,$i,$base64){
      //var_dump($m[0]);  此处的$m[0]代表匹配到的第一个图片地址
      //这里的$this->is_replace是我自己的一个函数,属于判断条件
         if($this->is_replace($m[$i],$id,$i)) {
    //如果符合的话,就替换为$base64[$i]
    return "<img src=\"$base64[$i]\">";
         }else {
         //如果条件不符合,就不替换
    return $m[0];
         }
         }, $content);