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]);
}