Создайте переменные if / else и preg match / replace на основе строки переменной - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть текстовая область, где наши пользователи могут заменять переменные данными реального заказа.

Например, {{service_name}} будет заменено на "DJ Booth"

Теперь я создаю возможностьпоказать определенный текст на основе названия службы.Например ...

Some text at the start

{{if|service_name=DJ Booth}}
  This is the text for DJs
{{endif}}

Some text in the middle

{{if|service_name=Dancefloor Hire}}
  This is the text for dancefloor hire
{{endif}}

Some text at the end

Преобразование preg_match в несколько строк было решено с помощью U (не жадный режим) и s (многострочный)

Итак, вывод теперьis ....

enter image description here

Проблема в том, что может быть несколько условных выражений, поэтому я не могу просто предварительно сопоставить тип и затем вывести значение,так как мне нужно перебрать каждое совпадение и заменить текст в том месте, где оно было найдено, вместо вывода внизу.

Так что я использую это ...

$service = get_service();
preg_match_all("/{{if\|service=(.*)}}(.*){{endif}}/sU", $text, $matches);
$i=0;
foreach($matches[1] as $match) {
  if ($match == $service) {
    print $match[2][$i];
  }
}

Что соответствует правильно, но просто выводит весь текст вместе, а не в том же месте, где они совпали.

ТАК мой вопрос ...

  • Как получить замену на месте?

Спасибо!

1 Ответ

0 голосов
/ 25 сентября 2018

Используя переменную поиска в шаблоне регулярных выражений, вы можете выбрать нужные заполнители.Вам не нужно сопоставлять / захватывать строку поиска, только текст, который следует за ней.Сопоставьте весь заполнитель и замените его группой захвата, заключенной в условный синтаксис.

  • Я использую \R для сопоставления с новыми строками.
  • Я использую \sдля соответствия всем пробелам.
  • s - это модификатор шаблона, который . соответствует любому символу, включая символы новой строки.
  • Соответствует символам \s и \R вне группы захватапозволяет тексту замены хорошо соответствовать соседнему тексту.

Код: ( Demo )

$text = 'Some text at the start

{{if|service_name=DJ Booth}}
  This is the text for DJs
{{endif}}

Some text in the middle

{{if|service_name=Dancefloor Hire}}
  This is the text for dancefloor hire
{{endif}}

Some text at the end';

$service = "Dancefloor Hire";
echo preg_replace("/{{if\|service_name=$service}}\s*(.*?)\R{{endif}}/s", "$1", $text);

Вывод:

Some text at the start

{{if|service_name=DJ Booth}}
  This is the text for DJs
{{endif}}

Some text in the middle

This is the text for dancefloor hire

Some text at the end

Расширение: Если вы хотите стереть все неквалифицированные заполнители, выполните второй проход и удалите все оставшиеся заполнители.

Демо

echo preg_replace(["/{{if\|service_name=$service}}\s*(.*?)\R{{endif}}/s", "/\R?{{if.*?}}.*?{{endif}}\R?/s"], ["$1", ""], $text);
...