【问题标题】:Limit preg_replace to two total replacements将 preg_replace 限制为两个总替换
【发布时间】:2014-11-17 01:34:46
【问题描述】:

我有以下 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 限制为两个替换总计,而不是每个阵列(或针)两个替换。

您能帮我将代码限制为两个替换吗?这是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);

【问题讨论】:

  • /thing.png|other.jpg/ PS:你可能还需要申请preg_quote

标签: php replace preg-replace preg-replace-callback


【解决方案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);

【讨论】:

  • 如果您想发布替代答案,您应该将其作为答案发布,而不是在问题中。
  • 这只是一个小改动
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 2019-03-30
  • 1970-01-01
相关资源
最近更新 更多