Już opublikowane rozwiązania regex - \((.*?)\)
i \(([^\)]+)\)
- nie zwracają najbardziej wewnętrznych ciągów między nawiasami otwierającymi i zamykającymi. Jeśli ciąg jest Text (abc(xyz 123)
one zarówno powrócić(abc(xyz 123)
jako cały mecz, a nie (xyz 123)
.
Wzorzec pasujący do podciągów (użyj z, preg_match
aby pobrać pierwszy i preg_match_all
wszystkie wystąpienia) w nawiasach bez innych otwierających i zamykających nawiasów między nimi to, jeśli dopasowanie powinno zawierać nawiasy:
\([^()]*\)
Lub chcesz uzyskać wartości bez nawiasów:
\(([^()]*)\)
\(\K[^()]*(?=\))
(?<=\()[^()]*(?=\))
Wymień *
się +
jeśli nie musi wynosić co najmniej 1 char pomiędzy (
i )
.
Szczegóły :
\(
- otwierający nawias okrągły (musi zostać zmieniony, aby wskazać literalny nawias, ponieważ jest używany poza klasą znaków)
[^()]*
- zero lub więcej znaków innych niż (
i)
(zwróć uwagę na te (
i )
nie muszą być znakami ucieczki wewnątrz klasy znaków, tak jak w niej, (
i )
nie można ich użyć do określenia grupowania i są traktowane jako dosłowne nawiasy)
\)
- zamykający nawias okrągły (musi zostać zmieniony, aby wskazać literalny nawias, ponieważ jest używany poza klasą znaków).
\(\K
Części w alternatywnych dopasowania regex (
i pomija z wartości dopasowania (z \K
operatorem zerowania meczu). (?<=\()
to pozytywne spojrzenie w tył, które wymaga (
natychmiastowego pojawienia się po lewej stronie bieżącej lokalizacji, ale(
nie jest dodawany do wartości dopasowania, ponieważ wzorce lookbehind (patrzenie w tył) nie są używane. (?=\()
to pozytywne spojrzenie w przód, które wymaga )
natychmiastowego pojawienia się znaku po prawej stronie bieżącej lokalizacji.
Kod 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]);
}
Wynik:
Array ( [0] => (text) [1] => (text here) )
Array ( [0] => text [1] => text here )
s($fullString)->between("(", ")")
pomocny, co znajdziesz w tej samodzielnej bibliotece .