Ограничьте preg_replace двумя полными заменами

У меня есть следующий код 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="https://web-answers.ru/wp-content/uploads/2019/03/$1" />', $message, 2);

Я добавил 2 ограничить preg_replace сделать максимум две замены.

Это сгенерирует следующий вывод:

<img src="https://web-answers.ru/wp-content/uploads/2019/03/thing.png">, <img src="https://web-answers.ru/wp-content/uploads/2019/03/other.jpg">, <img src="https://web-answers.ru/wp-content/uploads/2019/03/other.jpg">, other.jpg, last.tiff, <img src="https://web-answers.ru/wp-content/uploads/2019/03/thing.png">

Я хотел бы это вместо этого:

<img src="https://web-answers.ru/wp-content/uploads/2019/03/thing.png">, <img src="https://web-answers.ru/wp-content/uploads/2019/03/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="https://web-answers.ru/wp-content/uploads/2019/03/$0" />', $message, 2);

0

Решение

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);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]