La question de savoir lequel est le plus rapide et le meilleur fait l'objet de nombreuses discussions.
Si vous envisagez de passer un jour à PHP6, votre décision est prise. Sinon :
Le consensus général est que PCRE est la meilleure solution, mais si vous avez une page spécifique avec beaucoup de trafic, et que vous n'avez pas besoin de PHP6, cela peut valoir la peine de faire quelques tests. Par exemple, dans les commentaires du manuel PHP :
Dépréciation de POSIX regex en PHP pour la recherche en Perl, c'est comme substituer des planches de bois et des briques pour une maison avec des pièces et des murs préfabriqués. Bien sûr, vous pouvez être capable de mélanger et d'assortir certaines parties, mais cela fait beaucoup plus facile à modifier avec toutes les pièces disposées devant vous.
PCRE plus rapide que POSIX RE ? Pas toujours. Dans un récent projet de moteur de recherche ici chez Cynergi, j'avais une simple boucle avec quelques quelques fonctions ereg_replace() mignonnes qui prenait 3 minutes pour traiter les données. J'ai changé cette boucle de 10 lignes en un code de 100 lignes code manuscrit de 100 lignes pour le remplacement et la boucle prenait maintenant 10s pour traiter les mêmes données ! Cela m'a ouvert les yeux sur ce qui peut DANS CERTAINS CAS être très lent les expressions régulières. Dernièrement, j'ai décidé d'étudier les expressions régulières compatibles avec Perl compatibles avec Perl (PCRE). La plupart des pages prétendent que que les PCRE sont plus rapides que POSIX, mais quelques-unes affirment le contraire. J'ai décidé de de mes propres bechmarks. Mes premiers tests tests ont confirmé que PCRE était plus rapide, mais... les résultats étaient légèrement différents de ceux obtenus par les autres, donc j'ai décidé d'évaluer chaque cas de d'utilisation de RE que j'avais sur un projet de webmail sécurisé (et rapide) Webmail ici à Cynergi pour vérifier. Les résultats ? Peu concluants ! Parfois PCRE son plus rapide (parfois d'un facteur supérieur 100x plus rapide !), mais d'autres fois fois POSIX RE est plus rapide (par un facteur de 2x). Je dois encore trouver une règle sur quand l'un ou l'autre est plus rapide. Ce n'est pas seulement une question de taille des données de recherche, la quantité de données correspondantes, ou le "RE temps de compilation" qui montrerait quand on répète souvent la fonction : on pourrait siempre être plus rapide que le l'autre. Mais je n'ai pas trouvé de modèle ici. Mais la vérité doit être dite, je n'ai pas non plus pris le temps de regarder le code source source et d'analyser le problème. Je peux cependant vous donner quelques exemples. Le site POSIX RE ([0-9]{4})/([0-9]{2})/([0-9]{2})[^0-9]+ ([0-9]{2}):([0-9]{2}):([0-9]{2}) is 30% plus rapide en POSIX que lorsque converti en PCRE (même si vous utilisez \d et \D et l'appariement non avide). Sur D'autre part, un motif complexe PCRE complexe /[0-9]{1,2}[ \t ]+ [a-zA-Z]{3}[ \t ]+[0-9]{4}[ \t ]+[0-9]{1,2}:[0-9]{1,2}(:[0-9]{1,2})?[ \t ]+[+-][0-9]{4}/ est 2,5x plus rapide en PCRE que dans POSIX RE. De simples de remplacement simples comme ereg_replace( "[^a-zA-Z0-9-]+", "", $m ) ; sont 2x plus rapides dans POSIX RE que dans PCRE. Et ensuite, nous sommes à nouveau confus car un motif POSIX RE comme (^| \n | \r )begin-base64[ \t ]+[0-7]{3,4}[ \t ]+...... est 2x plus rapide que POSIX RE, mais le PCRE insensible à la casse /^Received[ \t ]* :[ \t ] par[ \t ]+([^ \t ]+)[ \t ]/i est 30x plus rapide que son version POSIX RE ! Lorsqu'il s'agit de sensibilité à la casse, PCRE a jusqu'à présent semblait être la meilleure option. Mais I trouvé un comportement vraiment étrange de ereg/eregi. Sur un très simple POSIX RE (^| \r | \n )mime-version[ \t ] : J'ai trouvé que eregi() prenait 3.60s (juste un nombre dans un benchmark de test), alors que le PCRE correspondant prenait 0.16s ! Mais si j'utilisais ereg() (sensible à la casse) le temps de temps POSIX RE est descendu à 0.08s ! J'ai donc enquêté plus avant. J'ai essayé de rendre le POSIX RE insensible à la casse lui-même. Je suis allé aussi loin que ceci : (^| \r | \n )[mM][iI][mM][eE]-vers[iI][oO][nN][ \t ]* : Cette version a également pris 0.08s. Mais si j'essaie d'appliquer la même règle pour n'importe laquelle des lettres "v", "e", "r" ou "s qui n'ont pas été modifiées, le temps revient à 3.60s, et pas progressivement, mais immédiatement ! progressivement, mais immédiatement ! Les données de test de données de test ne contenaient aucun "vers". d'autres mots "mime" ou tout autre "ion" qui pourraient "ion" qui pourrait confondre l'analyseur POSIX. l'analyseur POSIX, donc je suis perdu. En conclusion, ligne : toujours comparer votre PCRE / POSIX RE pour trouver le plus rapide ! Les tests ont été effectués avec PHP 5.1.2 sous Windows, en ligne de commande. Windows, en ligne de commande. Pedro Freire cynergi.com