J'essaie de comprendre comment obtenir le texte entre deux balises entre crochets mais ne vous arrêtez pas à la première fermeture)
__('This is a (TEST) all of this i want')
mon modèle actuel est __ \ ((. *? ) \)
qui me donne
__('This is a (TEST)
mais je veux
__('This is a (TEST) all of this i want') i dont want any of this;
Merci
3 Réponses :
Vous avez oublié d'échapper deux parenthèses dans votre regex: __ \ ((. *) \)
;
Vérifiez sur regex101.com .
Utilisez le modèle __ \ ((. *)? \)
.
Le \
échappe les parenthèses pour attraper les parenthèses littérales. Cela capture alors tout le texte à l'intérieur de cet ensemble de parenthèses.
Vous pouvez utiliser un sous-programme regex pour faire correspondre le texte entre parenthèses imbriquées après __
:
$s = "__('This is a (TEST) all of this i want') i dont want any of this; __(extract this)"; if (preg_match_all('~__(\(((?:[^()]++|(?1))*)\))~', $s, $matches)) { print_r($matches[2]); } // => Array ( [0] => 'This is a (TEST) all of this i want' [1] => extract this )
Voir le démo regex .
Détails
__
- une sous-chaîne __
(\ (((?: [^ ()] ++ | (? 1)) *) \))
- Groupe 1 (il sera récuré en utilisant le (? 1)
sous-programme):
\ (
- un (
char ((?: [^ ()] ++ | (? 1)) *)
- Groupe 2 capturant 0 ou plus de répétitions de 1+ caractères autres que ( code> et )
ou tout le modèle du groupe 1 est récuré
\)
- un )
caractère. Voir la démo PHP :
if (preg_match_all('~__(\(((?:[^()]++|(?1))*)\))~', $s, $matches)) { print_r($matches[2]); }