Preg_match_all,然后在使用php循环时删除重复项


preg_match_all, then remove duplicate when loop using php

虽然这里有很多类似的问题和答案,我已经尽了最大的努力使它工作,但没有运气。这是我的代码:

$content = "Blah...blah...[image=1], 
            blah...blah...blah...[image=2],
            blah...blah...blah...[image=1], no more...";
function get_image($content) 
{ 
  $stripper = $content;   
  preg_match_all("/'[image=(.+?)']/smi",$stripper, $search);
  $total = count($search[0]);    
    for($i=0; $i < $total; $i++) 
    {    
      $image_id = $search[1][$i];
      if($image_id > 0)
      {
        $image = 'This is an image: <img src="images/'.$image_id.'.jpg" />';
      }
      $stripper = str_replace($search[0][$i], $image, $stripper); 
    } 
  return $stripper; 
}    

我想删除重复的"[image=1]"并返回:

Blah...blah...This is an image: <image>, 
blah...blah...blah...This is an image: <image>, 
blah...blah...blah..., no more...

Blah...blah..., 
blah...blah...blah...This is an image: <image>, 
blah...blah...blah...This is an image: <image>, no more...

参见preg_replace_callback手册

使用状态变量跳过前面的值,如下所示:

  $content = preg_replace_callback(
      "/'[image=(.+?)']/smi",
      function ($m) {
          global $skip_images;
          $image = $m[1];
          if ( !isset($skip_images[$image]) ) {
              $skip_images[$image] = 1;
              return "<img src=$image.jpeg>";
          }
      },
      $content
  );

显然$skip_images代码可以写得更好;使用闭包状态变量,如果在其他地方或时间使用该回调,则必须清除该状态变量