2010-06-08 4 views

Répondre

4

suivant est tout droit du livre Writing Apache modules with Perl and C

regex_t *ap_pregcomp (pool *p, const char *pattern, int cflags); 
    void ap_pregfree (pool *p, regex_t *reg); 

Apache prend en charge les expressions régulières en utilisant l'expression régulière de la bibliothèque système routines regcomp(), regexec(), regerror() et regfree(). Si ces fonctions ne sont pas disponibles, Apache utilise son propre paquet de routines d'expressions régulières. La documentation pour les routines d'expression régulière peut être trouvée dans les pages de manuel de votre système. Si votre système ne prend pas en charge ces routines, la documentation du package d'expressions régulières d'Apache peut être trouvée dans le sous-répertoire regex/de l'arborescence des sources Apache.

La correspondance d'expression régulière se produit en deux phases. Dans la première phase, vous appelez regcomp() pour compiler une chaîne de modèle d'expression régulière dans un formulaire compilé. Dans la deuxième phase , vous passez le modèle compilé à regexec() pour faire correspondre le modèle de recherche à une chaîne source. Au cours de l'exécution de sa correspondance d'expression régulière, regexec() écrit les décalages de chaque sous-expression entre parenthèses correspondante dans un tableau nommé pmatch []. La signification de ce tableau deviendra évidente dans le prochain. Apache fournit des routines wrapper autour de regcomp() et regfree() qui rendent le travail avec les expressions régulières un peu plus simple. ap_pregcomp() fonctionne comme regcomp() pour compiler une chaîne d'expression régulière, sauf qu'elle alloue automatiquement la mémoire pour l'expression compilée à partir du pointeur de pool de ressources fourni. Le modèle contient la chaîne à compiler et cflags est un masque de bits qui contrôle le type d'expression régulière à exécuter. La liste complète des drapeaux peut être trouvée dans la page regcomp() .

En plus de l'affectation de l'expression régulière, ap_pregcomp() installe automatiquement un gestionnaire de nettoyage qui appelle regfree() pour libérer la mémoire utilisée par l'expression régulière compilée lorsque l'opération est terminée. En parlant de cela, le gestionnaire de nettoyage installé par ap_pregcomp() est ap_pregfree(). Il libère l'expression régulière en appelant regfree(), puis il se retire de la liste de gestionnaire de nettoyage pour s'assurer qu'il ne sera pas appelé deux fois. Vous pouvez appeler ap_pregfree() si, pour une raison improbable, vous devez libérer la mémoire utilisée par l'expression régulière avant que le nettoyage n'ait été effectué normalement.

char *ap_pregsub (pool *p, const char *input, const char *source, size_t nmatch, 
regmatch_t pmatch[ ]) 

Après avoir effectué un match d'expression régulière avec regexec(), vous pouvez utiliser ap_pregsub() pour effectuer une série de substitutions de chaîne en fonction des sous-expressions qui correspondaient au cours de l'opération.Cette fonction utilise le tableau pmatch [], que regexec() remplit avec les positions de début et de fin de toutes les sous-expressions entre parenthèses correspondant à l'expression régulière. Vous fournissez ap_pregsub() avec p, un pointeur de pool de ressources, une chaîne de caractères décrivant les substitutions à effectuer, source, la chaîne source utilisée pour la correspondance d'expression régulière, nmatch, la taille du tableau pmatch et pmatch lui-même. L'entrée est une chaîne arbitraire contenant les expressions $ 1 à $ 9. ap_pregsub() remplace ces expressions par les sous-expressions correspondantes correspondantes de la chaîne source. $ 0 est également disponible pour votre utilisation: il correspond à toute la chaîne correspondante. La valeur de retour sera une chaîne nouvellement allouée formée à partir de la chaîne d'entrée substituée.

L'exemple suivant montre que ap_pregsub() est utilisé pour remplacer les extensions .htm et .HTM par .html. Nous commençons par appeler ap_pregcomp() pour compiler l'expression régulière désirée et renvoyer le motif compilé dans la mémoire allouée à partir du pool de ressources . Nous spécifions les indicateurs qui rendent la correspondance insensible à la casse et utilisons la syntaxe d'expression régulière moderne. Nous procédons à l'initialisation du tableau pmatch [] pour contenir deux éléments regmatch_t. Deux éléments sont nécessaires: le premier qui correspond à 0 $ et le seconde pour la sous-expression simple parenthèse dans le modèle. Ensuite, nous appelons regexec() avec le motif compilé, le nom de fichier demandé, le tableau pmatch [] et sa longueur. Le dernier argument de regexec(), utilisé pour transmettre divers indicateurs d'option supplémentaires, est défini sur zéro. Si regexec() renvoie zéro, nous appelons ap_pregsub() pour interpoler la sous-expression correspondante (le nom de fichier moins son extension) dans la chaîne $ 1.html, en remplaçant effectivement l'extension.

ap_regmatch_t pmatch[2]; 
ap_regex_t *cpat = ap_pregcomp(r->pool, "(.+)\\.htm$", 
    AP_REG_EXTENDED|AP_REG_ICASE); 
if (ap_regexec(cpat, r->filename, cpat->re_nsub+1, pmatch, 0) == 0) 
{ 
    r->filename = ap_pregsub(r->pool, "$1.html", 
     r->filename, cpat->re_nsub+1, 
     pmatch); 
}