2
votes

obtenir tout le texte entre crochets mais ignorer les crochets imbriqués

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


0 commentaires

3 Réponses :


0
votes

Vous avez oublié d'échapper deux parenthèses dans votre regex: __ \ ((. *) \) ;

Vérifiez sur regex101.com .


0 commentaires

0
votes

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.


0 commentaires

1
votes

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


0 commentaires