Исходный код:
[display = "home"]
html code
[/display]
[display = "category"]
html code
[/display]
[display = "home"]
html code
[/display]
Подскажите, как написать регулярное выражение, что бы шорт-код например [display = "home"]...[/display] заменялся на пустоту. Главное, что бы он заменялся по очереди. То есть регулярное выражение должно находить начало [display = "..."]... и первый найденный [/display], а не последний. Старался описать понятно.
Делаю так в цикле, но результат плох:
$pattern = str_replace(["\"", "[", "]", " ", "/"], ["\\\"", "\[", "\]", "\s+", "\/"], $display[1][$key]);
$pattern2 = str_replace(["\"", "[", "]", " ", "/"], ["\\\"", "\[", "\]", "\s+", "\/"], $display[4][$key]);
$result = preg_replace('/'.$pattern.'(.+?)'.$pattern2.'/is', "", $result);
Где в $pattern попадает \[display = \"home\"\], а в $pattern2 попадает \[\/display\] но в итоге результат не тот, который ожидается.
Вот вам регулярка для шаблонизатора:
/\[display = "(.+)"\]([^[]+)\[\/display\]/U
Если использовать preg_replace_callback можно на лету менять содержимое или вовсе убирать блоки.
Пример работы регулярки: https://regex101.com/r/WlkqLp/1/
$regExp = '/\[display = "(.+)"\]([^[]+)\[\/display\]/U';
preg_replace_callback($regExp,function ($matches)
{
if($matches[1]=='home') return '';
if($matches[1]=='category') return $matches[2];
},$value);
Сборка персонального компьютера от Artline: умный выбор для современных пользователей