Как найти переменный текст в строке с помощью регулярных выражений - PullRequest
0 голосов
/ 03 мая 2019

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

Пример:

Original string:
Lorem ipsum dolor (Hello world) sit YEAH amet

Template:
consectetur adipiscing elit, sed do @BETWEEN("dolor (",") sit") eiusmod tempor incididunt ut labore et dolore @BEWTEEN("sit","amet")

Output:
consectetur adipiscing elit, sed do Hello world eiusmod tempor incididunt ut labore et dolore YEAH

Я пытаюсь получить @BETWEEN из шаблона с помощью регулярных выражений

@BETWEEN\([^\(\)]+\)

Но это не сработало из-за символа скобки в скобке @BETWEEN. Я не очень хорош в регулярных выражениях. Может кто-нибудь дать мне предложение о том, как улучшить регулярное выражение или любой другой метод, чтобы получить функцию @BETWEEN из шаблона

1 Ответ

1 голос
/ 03 мая 2019

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

$string = 'Lorem ipsum dolor (Hello world) sit YEAH amet';
$template = 'consectetur adipiscing elit, sed do @BETWEEN("dolor (",") sit") eiusmod tempor incididunt ut labore et dolore @BETWEEN("sit","amet")';

preg_match_all('/@BETWEEN\("([^"]+)","([^"]+)"\)/', $template, $matches, PREG_SET_ORDER);
foreach ($matches as $temp) {
    $regex = '/' . preg_quote($temp[1]) . '(.*?)' . preg_quote($temp[2]) . '/';
    preg_match($regex, $string, $replacement);
    $template = preg_replace('/' . preg_quote($temp[0]) . '/', $replacement[1], $template);
}
echo $template;

Выход:

consectetur adipiscing elit, sed do Hello world eiusmod tempor incididunt ut labore et dolore YEAH 

Обратите внимание, что это не будет работать, если строки в шаблонах шаблонов также содержат экранированные кавычки. Чтобы реализовать эту функцию в этом случае, вам нужно будет использовать регулярное выражение, полученное из чего-то вроде this question .

...