PHP регулярное выражение, теги встречаются в строке несколько раз

Моя цель — выделить то, что находится между тегами {{}}. Проблема в том, что если теги встречаются несколько раз, это не работает так, как я хочу.

$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: (не так, как я хочу)

Привет мой имя}} это бо. Или нет

Я чувствую, что есть что-то глупое, что я скучаю, просто не знаю, что. Вся помощь будет оценена.

РЕДАКТИРОВАТЬ: Спасибо! (. *?) работал как шарм, если вы напишите ответ, я отмечу его как решенный. Спасибо!

0

Решение

Почему бы тебе не попробовать это?

$pattern = "~{{([^}{]*)}}~";
$replacement = "<b>$1</b>";
echo preg_replace($pattern, $replacement, $string);

.* бы жадный матч То есть он съедает все между первым {{ и последнее }} брекеты. Чтобы сделать максимально короткое совпадение, вам нужно добавить квантификатор ? сразу после *, Все совпадающие символы сохраняются в первой группе из-за присутствия группы захвата в вашем шаблоне, т.е. (.*), Вот почему вы получаете строку name}} is bo. Or {{not в группу 1.

Шаблон Объяснение:

  • {{ Соответствует двум открывающимся фигурным скобкам.
  • ([^}{]*) Совпадает и захватывает любой символ ноль или более раз, но не из } или же {

  • }} Соответствует двум закрывающим фигурным скобкам.

1

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector