У меня есть следующий код 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);
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);
Других решений пока нет …