PHP expressions régulières - Partie VI Introduction Beaucoup des exemples que nous avons rencontrés sont des exemples simples. Dans cette section, nous examinons deux exemples qui sont plus exigeants. Avant de quitter cette partie de la série, nous allons parler de ce qui est appelé Backtracking.
Étapes nécessaires pour construire un masque Ce sont les étapes nécessaires pour construire un masque: * Spécifiez la tâche en détail, * Décomposer le problème en parties plus petites, * Traduire les petites pièces dans les expressions rationnelles, * Mélanger les expressions rationnelles, * Optimiser la finale combinée regexes. Deux exemples Exemple 1 code hexadécimal Couleur Vérifiez Spécifier la tâche en détail un exemple de code de couleur hexadécimal est # 4C8. Un autre exemple est # 44CC88.
* Un code hexadécimal commence par un dièse, suivies soit de 3 nombres hexadécimaux ou 6 nombres hexadécimaux. * Les chiffres hexadécimaux sont: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E et F. * Les lettres hexadécimaux peuvent être en minuscules ou majuscules. Découpant le problème en parties plus petites * Il commence par un #. * Il est suivi de 3 chiffres hexadécimaux ou * 6 nombres hexadécimaux * Il n'y a pas de caractère après les 3 ou 6 chiffres hexadécimaux. Traduire en regexes Il ya trois petites pièces ci-dessus.
La première partie donne à l'expression rationnelle: /^ # /La deuxième partie donne à l'expression rationnelle: /[0-9a-fA-F] {3} /La troisième partie donne à l'expression rationnelle: /[0-9a-fA-F] { 6} /La dernière partie donne à l'expression rationnelle: /$ /Combinant le Regexes Ceci est l'expression rationnelle combinée: /^ # ([0-9a-fA-F] {3} $) | ([0-9a-fA-F ] {6} $) /Notez le métacaractère suppléant, | pour les trois ou six chiffres hexadécimaux. A noter également les parenthèses qui séparent les groupes alternés.
Optimisation de la Regex combinée Cela signifie raccourcir l'expression rationnelle combinée. Notez que 0-9 est abrégé à \\ d. Donc, dans l'expression rationnelle combinée, nous changeons les deux occurrences de 0-9 \\ D. Le regex est optimisé: /^ # ([\\ da-FA-F] {3} $) | ([\\ da-FA-F] {6} $) /Cette expression est plus court que le ci-dessus par deux caractères. Le code suivant illustre cela: $ subject = "# 44CC88"; if (preg_match ("/^ # ([\\ da-FA-F] {3} $) | ([\\ da-FA-F] {6} $) /", $ subject)) echo "correspondance". "Else echo" ne correspond pas ".
"?> Exemple 2 Nom de l'utilisateur Vérifiez Spécifier la tâche en détail Supposons que nous avons un site où les utilisateurs doivent se connecter. Nous pouvons dire à l'utilisateur que son nom devrait contenir des lettres en minuscule ou majuscule et /ou de chiffres de zéro à neuf et /ou le trait de soulignement, _. Nous insistons également pour que le nom ne doit pas être inférieure à 3 caractères ou plus que 18 caractères. Dans cet exemple, nous avons imposé les détails de spécification.
Briser le problème en petites parties Un nom de connexion est composé de * lettres de l'alphabet en minuscules ou supérieure entre 3 à 18 lettres, inclusivement, et /ou * chiffres de 0 à 9 entre 3 à 18 chiffres, inclusivement, et /ou * le trait de soulignement entre 3 à 18 chiffres, inclusivement. Cela signifie, vous pouvez avoir jusqu'à 18 caractères de soulignement pour un nom. Laissons ce que pour la simplicité. * Nous devons limiter la chaîne de l'objet de 3 ou 6 caractères.
Traduire en regexes Le regex pour le premier point est: /^ [a-zA-Z] {} 3,18 $ /l'expression rationnelle pour le second point est: /^ [0-9] {} 3,18 $ /Le regex pour le troisième point est: /^ [_] {} 3,18 $ /Le quatrième point est inhérent dans les expressions rationnelles ci-dessus. En combinant les expressions rationnelles Dans la section de rupture vers le bas, les trois points ci-dessus sont combinés avec la phrase, "et /ou" Il n'y a aucun moyen direct de le faire, nous avons donc à déduire.
Ceci est l'expression rationnelle combinée: /^ [a-zA-Z0-9 _] {} 3,18 $ /Optimisation de la Regex combinée Cela signifie raccourcir l'expression rationnelle combinée. Notez que la classe [a-zA-Z0-9_] est l'abréviation \\ w. Le regex est optimisé: /^ [\\ w] {} 3,18 $ /Revenant Nous avons vu comment faire correspondre des alternatives en utilisant le métacaractère de l'alternance, |. Lorsque correspondant alternatives, PHP utilise un processus connu sous le nom retours en arrière. Je vais illustrer cela par un exemple.
Considérons l'expression suivante: preg_match ("/(124 | 123) (46 | 4 | 45) /", "12345") je vais vous expliquer marche arrière en expliquant le fonctionnement de l'expression ci-dessus. Les étapes suivantes expliquent comment PHP résout cette expression. A. Il commence avec le premier numéro de la chaîne sujet '1'. B. Il essaie la première alternative dans le premier sous-motif «124». C. Il voit l'adaptation de '1' suivi de '2'. C'est bon. D. Il remarque que «4» dans l'expression rationnelle ne correspond pas à '3' dans la chaîne de l'objet - qui est une impasse.
Donc, il fait machine arrière deux caractères dans la chaîne de l'objet et prend la deuxième alternative dans le premier sous-motif '123'. E. Il correspond à '1' suivi de '2' puis '3'. Le premier sous-motif est satisfaite. F. Il se déplace à la deuxième sous-motif et choisit la première alternative '46'. G. Il correspond à la '4' dans la chaîne subpattern. H. Cependant, '6' dans l'expression rationnelle ne correspond pas à «5» dans la chaîne subpattern, ce qui est un impasse.
Il revient en arrière d'un caractère dans la chaîne subpattern et prend la seconde alternative dans le deuxième sous-motif '4'. '4' I. matchs. Le deuxième sous-motif est satisfaite. J. Nous sommes à la fin de l'expression rationnelle; nous avons fini! Nous avons identifié le '1234' de la chaîne "12345". Il ya deux choses à noter à propos de ce processus. Tout d'abord, la troisième alternative dans le deuxième sous-motif '45' permet également un match, mais le processus est arrêté avant qu'il ne soit à la troisième alternative - à une position donnée, le plus à gauche conquiert.
Deuxièmement, le processus était en mesure d'obtenir un match à la première position de caractère de la chaîne sujet '1'. Si il n'y avait pas les matchs de la première position, PHP va passer à la deuxième position de caractère «2» et de tenter le match tout recommencer. PHP abandonne et déclare "12345" = ~ /(124 | 123) (46 | 4 | 45) /, être fausse, que lorsque tous les chemins possibles dans toutes les positions de caractères possibles ont été épuisées.
Le x Modifier les détails Ce modificateur est réglé en mettant x en minuscule juste à côté de la seconde barre oblique de l'expression rationnelle. Voilà: /motif /x Si ce modificateur est réglé, les caractères d'espacement dans le modèle sont ignorés, sauf lorsqu'ils sont échappés, ou à l'intérieur d'une classe de caractères, et les caractères entre # non échappés et en dehors d'une classe de personnage et le caractère de nouvelle ligne suivante, inclusivement, sont également ignoré. Je vais illustrer tout cela.
Il dit les caractères d'espacement dans le modèle sont ignorés, sauf lorsqu'ils sont échappés, ou à l'intérieur d'une classe de personnage. Considérez la chaîne sujet: $ subject = "Je suis un homme assis."; L'expression suivante avec le x modificateur ne produit pas un match. preg_match ("/homme assis /x", $ subject) Ceci est parce que dans l'expression régulière, l'espace unique entre «homme» et «assis» et «assis» et «bas» ne sont pas reconnus, avec la présence de la x modificateur. Si vous supprimez ces espaces correspondants dans le sujet que vous aurez un match, avec le modificateur x.
Le sujet suivant va produire un match avec l'expression rationnelle ci-dessus: $ subject = "Je suis un mansittingdown."; Si vous souhaitez que le sujet original et regex pour correspondre, alors vous devez échapper aux espaces dans l'expression régulière. L'expression suivante produit un match avec le sujet initial: preg_match ("/man \\ \\ séance bas /x", $ subject) Un échappé espace unique est "\\". Parlons maintenant de l'espace blanc dans une classe de caractères. Notez que les blancs est en fait [\\ \\ t \\ r \\ n \\ f], non seulement "\\".
Cependant, continuons notre illustration en utilisant "\\". Nous utilisons le même sujet, à savoir: $ subject =; "Je suis un homme assis." Si nous voulons correspondre à l'espace en face de séance, suivi par "assis", avec le modificateur x, alors notre regex pourrait être; /[] Assis /x Notez que les espaces dans la classe de caractères n'a pas été échappé. Autrement dit, avec le modificateur x, les espaces à l'intérieur d'une classe de personnage est pas échappé, tandis que les espaces en dehors de la classe de personnage est échappé.
L'expression suivante produit un match: preg_match ("/[] assis /x", $ subject) Avec le modificateur x, tout texte entre le caractère # et caractère de nouvelle ligne, implicite ou explicite est ignoré. Un caractère de nouvelle ligne implicite est réalisé en appuyant sur la touche Entrée lorsque vous tapez. Un caractère explicite nouvelle ligne est réalisé en tapant le caractère \\ n. Considérons le code suivant: $ subject = "Je suis un homme assis."; $ re = "/man \\ #COMMENT va ici assis /x"; if (preg_match (re $, $ subject)) echo "correspondance". ".
"? "Else echo" ne correspond pas> Le sujet est: $ subject = "Je suis un homme assis."; L'expression rationnelle est $ re = "/man \\ #COMMENT va ici assis /x"; A noter la présence du caractère # et le caractère de nouvelle ligne implicite, obtenu après le mot, «ici» en appuyant sur la touche Entrée. Un match est produite. La chaîne de sous qui est réellement adapté est "homme assis". Dans le code suivant, le caractère de nouvelle ligne est explicite, avec \\ n. Un match est également produite. $ subject = "Je suis un homme assis.
"; $ re = "/man \\ #COMMENT va ici \\ nsitting /x"; if (preg_match (re $, $ subject)) echo "correspondance". "Else echo" ne correspond pas "."?>