Les solutions regex déjà postées - \((.*?)\)
et \(([^\)]+)\)
- ne renvoient pas le le plus intime entre une parenthèse ouverte et une parenthèse fermée. Si une chaîne est Text (abc(xyz 123)
ils les deux retourner a (abc(xyz 123)
comme un match entier, et non (xyz 123)
.
Le motif qui correspond aux sous-chaînes (à utiliser avec preg_match
pour récupérer le premier et preg_match_all
pour rechercher toutes les occurrences) entre parenthèses sans autres parenthèses ouvertes et fermées entre elles est, si la correspondance doit inclure des parenthèses :
\([^()]*\)
Ou bien, vous voulez obtenir des valeurs sans parenthèses :
\(([^()]*)\) // 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
Remplacer *
con +
s'il doit y avoir au moins 1 caractère entre (
et )
.
Détails :
-
\(
- une parenthèse ouvrante (doit être échappée pour désigner une parenthèse littérale car elle est utilisée en dehors d'une classe de caractères)
-
[^()]*
- zéro ou plus des caractères autres que (
et )
(notez ces (
et )
ne doivent pas être échappés à l'intérieur d'une classe de caractères comme à l'intérieur de celle-ci, (
et )
ne peuvent pas être utilisées pour spécifier un regroupement et sont traitées comme des parenthèses littérales)
-
\)
- une parenthèse fermante (doit être échappée pour désigner une parenthèse littérale car elle est utilisée en dehors d'une classe de caractères).
Le site \(\K
la partie dans une regex alternative correspond (
et omet de la valeur de correspondance (avec l'option \K
opérateur de réinitialisation des correspondances). (?<=\()
est un regard positif qui nécessite un (
pour apparaître immédiatement à gauche de l'emplacement actuel, mais l'icône (
n'est pas ajouté à la valeur de la correspondance puisque les motifs lookbehind (lookaround) ne sont pas consommés. (?=\()
est un lookahead positif qui nécessite un )
pour apparaître immédiatement à droite de l'emplacement actuel.
Code 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
}
Sortie :
Array ( [0] => (text) [1] => (text here) )
Array ( [0] => text [1] => text here )
0 votes
Vous pourriez trouver
s($fullString)->between("(", ")")
utile, comme on le trouve dans cette bibliothèque autonome .