虽然这里有很多类似的问题和答案,我已经尽了最大的努力使它工作,但没有运气。这是我的代码:
$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代码可以写得更好;使用闭包状态变量,如果在其他地方或时间使用该回调,则必须清除该状态变量