Вже опубліковані рішення регулярних виразів - \((.*?)\)і \(([^\)]+)\)- не повертають внутрішніх рядків між відкритою та закритою дужками. Якщо рядок є, Text (abc(xyz 123)вони обидва повертають a (abc(xyz 123)як цілий збіг, а ні (xyz 123).
Шаблон, який відповідає підрядкам (використовуйте preg_matchдля отримання першого та preg_match_allотримання всіх випадків) у дужках без інших відкритих та закритих дужок між ними, якщо відповідність повинна включати дужки:
\([^()]*\)
Або ви хочете отримати значення без дужок:
\(([^()]*)\)
\(\K[^()]*(?=\))
(?<=\()[^()]*(?=\))
Замініть *на, +якщо між (і повинен бути принаймні 1 символ ).
Подробиці :
\( - відкриваюча кругла дужка (має бути екранованою для позначення буквальної дужки, оскільки вона використовується поза класом символів)
[^()]*- нуль або більше символів , крім (і )(зверніть увагу , це (і )не повинні бути екрановані всередині класу символів , як всередині нього, (і )не може бути використаний для вказівки групування і розглядаються в якості буквальних дужках)
\) - закриваюча кругла дужка (її потрібно вимкнути для позначення буквальної дужки, оскільки вона використовується поза класом символів).
\(\KУчасть в альтернативних матчах регулярних виразів (і опускають від значення матчу (з \Kоператором скидання матчу). (?<=\()є позитивним оглядом позаду, який вимагає, щоб a (з'явився відразу зліва від поточного розташування, але (не додається до значення збігу, оскільки шаблони огляду (lookaround) не споживають. (?=\()є позитивним результатом пошуку, який вимагає появи )символу відразу праворуч від поточного місця.
PHP-код :
$fullString = 'ignore everything except this (text) and (that (text here))';
if (preg_match_all('~\(([^()]*)\)~', $fullString, $matches)) {
print_r($matches[0]);
print_r($matches[1]);
}
Вихід:
Array ( [0] => (text) [1] => (text here) )
Array ( [0] => text [1] => text here )
s($fullString)->between("(", ")")корисним, як це знайдено в цій автономній бібліотеці .