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 に答える