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_matchaby pobrać pierwszy i preg_match_allwszystkie 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).
\(\KCzęści w alternatywnych dopasowania regex (i pomija z wartości dopasowania (z \Koperatorem 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 .