получить весь текст между скобками, но пропустить вложенную скобку - PullRequest
2 голосов
/ 21 марта 2019

Я пытаюсь выяснить, как получить текст между двумя тегами в скобках, но не останавливаюсь при первом закрытии)

__('This is a (TEST) all of this i want') i dont want any of this;

мой текущий шаблон __\((.*?)\)

, что дает мне

__('This is a (TEST) 

но я хочу

__('This is a (TEST) all of this i want') 

Спасибо

Ответы [ 3 ]

1 голос
/ 21 марта 2019

Вы можете использовать подпрограмму регулярного выражения для сопоставления текста во вложенных скобках после __:

if (preg_match_all('~__(\(((?:[^()]++|(?1))*)\))~', $s, $matches)) {
    print_r($matches[2]);
}

См. Демоверсию regex .

Подробнее

  • __ - подстрока __
  • (\(((?:[^()]++|(?1))*)\)) - Группа 1 (она будет повторяться с использованием подпрограммы (?1)):
    • \( - ( char
    • ((?:[^()]++|(?1))*) - Группа 2 захватывает 0 или более повторений любых 1+ символов, отличных от ( и ), или весь шаблон Группы 1 повторяется
    • \) - ) char.

См. Демонстрационную версию PHP :

$s = "__('This is a (TEST) all of this i want') i dont want any of this; __(extract this)";
if (preg_match_all('~__(\(((?:[^()]++|(?1))*)\))~', $s, $matches)) {
    print_r($matches[2]);
}
// => Array ( [0] => 'This is a (TEST) all of this i want'  [1] => extract this )
0 голосов
/ 21 марта 2019

Используйте шаблон __\((.*)?\).

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

0 голосов
/ 21 марта 2019

Вы забыли экранировать две скобки в своем регулярном выражении: __\((.*)\);

Проверка на regex101.com .

...