2009-06-02 11 views
0

Comment puis-je définir quel ordre correspond à des éléments dans une expression régulière PCRE?Ordre de correspondance dans PCRE

J'ai une expression régulière dynamique qu'un utilisateur peut fournir et qui est utilisée pour extraire deux valeurs d'une chaîne et les stocker dans deux chaînes. Cependant, il existe des cas où les deux valeurs peuvent être dans la chaîne dans l'ordre inverse, de sorte que le premier (\ w +) ou tout ce qui doit être stocké dans la deuxième chaîne.

+1

Pouvez-vous donner quelques exemples? – DrAl

Répondre

3

vous pouvez extraire les chaînes par nom en utilisant

(?<name>\w+) 

et obtenir les valeurs avec

pcre_get_named_substring 
+0

Mais comment savez-vous quel nom attribuer à quelle sous-chaîne? Cela ne vous rapproche pas du vrai problème de savoir quel groupe correspond à quelle sous-chaîne. –

1

Si vous correspondant à deux parties avec le même subpattern (comme \w+), vous êtes pas de chance. Mais si les sous-motifs sont distinctement différents, vous avez quelques options, aucune d'elles très jolie. Voici une expression rationnelle qui utilise une construction conditionnelle pour correspondre aux src et type attributs d'un élément de script HTML soit dans l'ordre:

\b(?(?=src=) 
    src="([^"]*)"\s+type="([^"]*)"| 
    type="([^"]*)"\s+src="([^"]*)" 
) 

(AVERTISSEMENT: Ce regex fait beaucoup d'hypothèses irréalistes, chef parmi eux que les deux attributs seront présents et qu'ils seront adjacents les uns aux autres. Je suis seulement en utilisant pour illustrer la technique.)

Si l'attribut src apparaît d'abord, les valeurs src et type seront capturés dans les premier et deuxième groupes, respectivement. Sinon, ils apparaîtront dans les quatrième et troisième groupes respectivement. Les groupes nommés rendraient plus facile le suivi des choses, surtout si vous pouviez utiliser le même nom dans plus d'endroits que vous le pouvez dans les expressions rationnelles .NET. Malheureusement, PCRE exige que chaque groupe nommé ait un nom unique, ce qui est trop mauvais; c'est une très belle fonctionnalité.

Questions connexes