Sous-masques
Les sous-masques sont délimités par des parenthèses, et peuvent être imbriqués. Ajouter des sous-masques a deux utilités :
-
Localiser un ensemble d'alternatives. Par exemple, le motif cat(aract|erpillar|) trouve un des mots "cat", "cataract", ou "caterpillar". Sans les parenthèses, cela trouverait "cataract", "erpillar" ou la chaine vide.
-
Cela configure le sous-masque comme capturant. Lorsque tout le motif correspond, la portion de la sous-chaine qui correspond au sous-masque est passé à l'appelant grâce à l'argument ovector de pcre_exec(). Les parenthèses ouvrantes sont comptées depuis la gauche vers la droite (commençant à 1) jusqu'à obtenir le nombre des sous-masques capturants.
Par exemple, soit la chaîne sujet "le roi soleil" qui est utilisée avec le masque suivant : Le ((roi|prince) (soleil|charmant)), les sous-masques capturés sont "roi soleil", "roi", et "soleil", numérotés respectivement 1, 2, et 3.
L'ubiquité des parenthèses n'est pas toujours simple d'emploi. Il y a des moments où regrouper des sous-masques est nécessaire, sans pour autant capturer la valeur trouvée. Si une parenthèse ouvrante est suivie de "?:", le sous-masque ne capture pas la chaîne assortie, et ne sera pas compté lors de la numérotation des captures. Par exemple, avec la chaîne "le prince charmant", utilisé avec le masque Le (( ?roi|prince) (soleil|charmant)) les chaînes capturées seront "prince charmant" et "charmant", numérotés respectivement 1 et 2. Le nombre maximal de chaînes capturées est de 99, et le nombre total de sous-masques (capturant ou non) ne doit pas dépasser 200.
En guise de raccourci, si n'importe quelle option de configuration est requise au début des sous-masques non-capturants, les lettres d'option peuvent apparaître entre le signe "?" et le signe ":". Ainsi, les 2 masques
(?i:samedi|dimanche) (?:(?i)samedi|dimanche)
captureront exactement les mêmes chaînes. Du fait que les branches alternatives sont testées de la gauche vers la droite, et que les options ne sont pas réinitialisées tant que le sous masque n'est pas atteint, une option de configuration d'une branche n'affecte pas les branches sous-jacentes ; ainsi, les 2 masques ci-dessus captureront "SAMEDI", mais aussi "Samedi".
Il est possible de nommer un sous masque en utilisant la syntaxe (?P<name>pattern). Ce sous masque sera alors indexé dans le tableau de concordance par sa position, ainsi que par son nom. PHP 5.2.2 a introduit 2 nouvelles syntaxes : (?<name>pattern) et (?'name'pattern).
Quelques fois, il est nécessaire d'avoir plusieurs correspondances en alternant les sous groupes dans une expression régulière. Normallement, chacun recevra son propre nombre de références arrières même si seulement un d'entre eux ne peut correspondre. Pour éviter cela, la syntaxe (?| permet d'autoriser les nombres dupliqués. Soit l'expression ci-après utilisée avec la chaine Sunday:
(?:(Sat)ur|(Sun))day
Ici Sunest stocké dans la référence arrière 2, alors que la référence arrière 1 est vide. La correspondance mène donc à Sat dans la référence arrière 1 alors que la référence arrière 2 n'existe pas. Changer le masque en utilisant (?| résoud ce problème:
(?|(Sat)ur|(Sun))day
Avec ce masque, à la fois Sun et Sat seront stockés dans la référence arrière 1.