0

虽然这里有很多类似的问题和答案,我已经尽力让它发挥作用,但没有运气。这是我的代码:

$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...
4

1 回答 1

1

参见手册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 代码可以写得更好;使用闭包状态变量,或者如果您在另一个地方或时间使用该回调,则必须将其清除。

于 2013-01-20T18:39:16.970 回答