Уже опубликованные решения регулярных выражений - \((.*?)\)
и \(([^\)]+)\)
- не возвращают внутренние строки между открывающими и закрывающими скобками. Если строка Text (abc(xyz 123)
, они оба возвращают a (abc(xyz 123)
в целом, а не (xyz 123)
.
Шаблон, который соответствует подстрокам (используйте с preg_match
для извлечения первого и preg_match_all
для извлечения всех вхождений) в круглых скобках без других открывающих и закрывающих скобок между, если совпадение должно включать скобки:
\([^()]*\)
Или вы хотите получить значения без скобок:
\(([^()]*)\) // get Group 1 values after a successful call to preg_match_all, see code below
\(\K[^()]*(?=\)) // this and the one below get the values without parentheses as whole matches
(?<=\()[^()]*(?=\)) // less efficient, not recommended
Замените *
на +
, если между (
и )
.
должен быть хотя бы 1 символ.
подробности
\(
- открывающая круглая скобка (должна быть экранирована для обозначения буквенной круглой скобки, так как она используется вне класса символов)
[^()]*
- ноль или более символов, отличных от (
и )
(обратите внимание, что (
и )
не нужно экранировать внутри класса символов, как внутри него, (
и )
не могут использоваться для указания группировки и рассматриваются как буквальные скобки)
\)
- закрывающая круглая скобка (должна быть экранирована для обозначения буквенной круглой скобки, так как она используется вне класса символов).
Часть \(\K
в альтернативном регулярном выражении соответствует (
и исключается из значения совпадения (с оператором сброса совпадения \K
). (?<=\()
является положительным взглядом сзади, который требует, чтобы (
появлялся непосредственно слева от текущего местоположения, но (
не добавляется к значению совпадения, так как паттерны lookbehind (lookaround) не используют. (?=\()
- это позитивный прогноз, который требует, чтобы символ )
появлялся сразу справа от текущего местоположения.
PHP код :
$fullString = 'ignore everything except this (text) and (that (text here))';
if (preg_match_all('~\(([^()]*)\)~', $fullString, $matches)) {
print_r($matches[0]); // Get whole match values
print_r($matches[1]); // Get Group 1 values
}
Выход:
Array ( [0] => (text) [1] => (text here) )
Array ( [0] => text [1] => text here )