У меня есть следующая строка:
"{My {formatted {hi|hello}|formate{hi|hello} } {option 1|option 2|option 3}}";
Я хочу найти результат между «{» и «}» скобками.
Также результат должен быть из внешнего слоя, а не {hi|hello}
но:
"My {formatted {hi|hello}|formate{hi|hello} } {option 1|option 2|option 3}"
/^{(.*)}$/
бы первый и последний {
и }
используется через $var = preg_replace('/^{(.*)}$/', '$1', $your_text);
Это особенно можно сделать с помощью базовых операций с строкой, вы можете продвинуть это регулярное выражение к /^[^{]*{(.*)}[^{]*$/
что позволит вам помещать символы перед нужной строкой и после этого. Опять же, это можно сделать с помощью строковых операций, используя substr
и strrpos
.
Вы можете извлечь самое внешнее содержимое из числа неопределенных уровней вложенных скобок с помощью этого шаблона:
$pattern = '~{((?>[^{}]++|(?R))+)}~';
где (?R)
означает повторение всего рисунка . Это рекурсивный подход.
Если вам нужно то же самое использовать в качестве подшаблона в более крупном выражении, вы должны использовать:
({((?>[^{}]++|(?-2))+)})
так как (?-2)
является относительной ссылкой на вторую группу захвата слева (первая здесь).
Сведения о шаблоне:
( # first capturing group { # literal { ( # second capturing group (what you are looking for) (?> # atomic group [^{}]++ # all characters except { and }, one or more time | # OR (?-2) # repeat the first capturing group (second on the left) )+ # close the atomic group, repeated 1 or more time ) # close the second capturing group } # literal } ) # close the first capturing group
Я думаю, вы можете использовать split Function.E, тогда вы можете использовать Replace .