Моя цель — выделить то, что находится между тегами {{}}. Проблема в том, что если теги встречаются несколько раз, это не работает так, как я хочу.
$string1 = "hello my {{name}} is bo.";
$string2 = "hello my {{name}} is bo. Or {{not}}";
$startPoint = '{{';
$endPoint = '}}';
$result = preg_replace('/('.preg_quote($startPoint).')(.*)('.preg_quote($endPoint).')/si', '<b>$2</b>', $string);
Результат с string1: (как и должно быть)
Привет мой название это бо.
Результат с string2: (не так, как я хочу)
Привет мой имя}} это бо. Или нет
Я чувствую, что есть что-то глупое, что я скучаю, просто не знаю, что. Вся помощь будет оценена.
РЕДАКТИРОВАТЬ: Спасибо! (. *?) работал как шарм, если вы напишите ответ, я отмечу его как решенный. Спасибо!
Почему бы тебе не попробовать это?
$pattern = "~{{([^}{]*)}}~";
$replacement = "<b>$1</b>";
echo preg_replace($pattern, $replacement, $string);
.*
бы жадный матч То есть он съедает все между первым {{
и последнее }}
брекеты. Чтобы сделать максимально короткое совпадение, вам нужно добавить квантификатор ?
сразу после *
, Все совпадающие символы сохраняются в первой группе из-за присутствия группы захвата в вашем шаблоне, т.е. (.*)
, Вот почему вы получаете строку name}} is bo. Or {{not
в группу 1.
Шаблон Объяснение:
{{
Соответствует двум открывающимся фигурным скобкам.([^}{]*)
Совпадает и захватывает любой символ ноль или более раз, но не из }
или же {
}}
Соответствует двум закрывающим фигурным скобкам.
Других решений пока нет …