Замена тегов в фигурных скобках, даже вложенных тегов, с помощью регулярных выражений - PullRequest
0 голосов
/ 27 апреля 2010

Пример

preg_replace('/\{[a-zA-Z.,\(\)0-9]+\}/', 'Replaced', 'Lorem ipsum dolor sit {tag1({tag2()})}, consectetur adipiscing elit.');

Результат:

Lorem ipsum dolor sit {tag1 (Replaced)}, элитный администратор.

Вопрос

Как видите, тег2 заменен, но я хочу заменить тег1. Кто-нибудь знает, как я могу это сделать?

(В некоторых случаях это может выглядеть так: {tag1({tag2({tag3()})})}) и т. Д.)

Кстати, я на самом деле использую preg_replace_callback, но его проще показать с помощью preg_replace

Вот сайт, где вы можете проверить код: http://www.spaweditor.com/scripts/regex/index.php

Ответы [ 3 ]

1 голос
/ 28 апреля 2010

Как только вы начинаете говорить о сопоставлении вложенных шаблонов (например: сопоставление внутренней группы в скобках в чем-то вроде (foo (bar) fu)), тогда регулярное выражение является неправильным инструментом. Регулярные выражения не имеют состояния, что в данном случае означает, что они не могут сосчитать, сколько открытых скобок.

Если вы хотите сделать что-то подобное, вам может понадобиться парсер

1 голос
/ 27 апреля 2010

Вам необходимо добавить фигурные скобки в свой набор символов. Вот образец, который я использовал:

/\{[a-zA-Z.,\(\)\{\}0-9]+\}/

А вот и результат:

"Lorem ipsum dolor sit Replaced, consectetur adipiscing elit."
0 голосов
/ 09 октября 2018

Возможно, вы захотите использовать T-Regx :

<?php
$subject = 'Lorem ipsum dolor sit {tag1({tag2()})}, consectetur adipiscing elit.';

pattern('\{[a-zA-Z.,()0-9]+\}')->replace($subject)->first()->with('Replaced');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...