我有以下PHP代码,用于为预定义列表中的图像生成HTML代码:
$message = "thing.png, other.jpg, other.jpg, other.jpg, last.tiff, thing.png";
$keywords = array("thing.png", "other.jpg");
foreach ($keywords as &$value) $value = "/(".$value.")/";
echo $message = preg_replace($keywords, '<img src="images/$1" />', $message, 2);
我添加了2
来限制preg_replace
,最多可以进行两次替换。
这会产生以下输出:
<img src="images/thing.png">, <img src="images/other.jpg">, <img src="images/other.jpg">, other.jpg, last.tiff, <img src="images/thing.png">
我想要这样:
<img src="images/thing.png">, <img src="images/other.jpg">, other.jpg, other.jpg, last.tiff, thing.png
请注意,我希望的行为将preg_replace
限制为两个替换 total ,而不是每个数组(或针)的两个替换。
你能帮助我将代码限制为两次总替换吗?这是preg_replace_callback
的用途吗?
我的最终代码:
$message = "thing.png, other.jpg, other.jpg, other.jpg, last.tiff, thing.png";
$keywords = array("thing.png", "other.jpg");
$regexp = "/".implode("|", array_map("preg_quote", $keywords))."/";
echo $message = preg_replace($regexp, '<img src="images/$0" />', $message, 2);
答案 0 :(得分:1)
preg_replace
获取一个参考参数,该参数填充了所做的替换次数。您可以使用它从总数中减去,直到达到极限。
$total = 2;
foreach ($keywords as $value) {
$regexp = "/" . preg_quote($value) . "/";
$message = preg_replace($regexp, '<img src="$image/$0" />', $message, $total, $count);
$total -= $count;
if ($total == 0) {
break;
}
}
或者您可以使用替换将它们全部合并到一个正则表达式中:
$regexp = implode('|', array_map('preg_quote', $keywords));
$message = preg_replace("/$regexp/", '<img src="$image/$0" />', $message, 2);