|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
![]() ![]() Josselin Développeur Web Inscription : janvier 2004 Messages : 9 050 ![]() |
Salut,
Je suis en train de créer un mini moteur de template qui se veut dynamique, et je me posais quelques questions sur les performances de celui-ci. Je cherche donc à optimiser au maximum l'expression régulière et je viens de tomber sur quelques résultats assez surprenants .. Par exemple : Code :
Seulement d'après mes tests, elle ne l'est que de 0.00134 % ! Il me semblait pourtant que c'était vraiment beaucoup plus lourd .. Autre exemple, avec un délimiteur plus évolué : Code :
Quelqu'un saurait-il pourquoi ? Y aurait-il un meilleur moyen d'optimiser ce genre de script ? Merci ! |
||||
|
|
10
|
|
|
#2 | ||
|
Membre chevronné
![]() Développeur Web Inscription : mars 2011 Messages : 399 ![]() |
Je n'ai pas les moyens de voir le temps que prennent ces 3 patterns suivant mais personnellement j'aurais tenté :
Code :
Code :
preg_replace( '/{:(.*?):}/e', "$\\1", $html ); // La même mais qui est plus général et peut causer des erreurs...
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery. Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels. Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc... |
||
|
20
|
|
|
#3 | |||
![]() ![]() Josselin Développeur Web Inscription : janvier 2004 Messages : 9 050 ![]() |
Citation:
Le deuxième est environ 3.5 % plus rapide que le Ungreedy. Le dernier est juste 1 % plus rapide que le Ungreedy. Donc pas de différence significative .. (Pour les temps affichés, j'ai remplacé les guillemets par des apostrophes dans la chaine de remplacement, ce qui fait gagner 0.5 % dans chacun des cas) |
|||
|
|
10
|
|
|
#4 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
normalement la syntaxe correct serait :
(?<={)[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?=}) mais c'est pas forcement rapide
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#5 |
![]() ![]() Josselin Développeur Web Inscription : janvier 2004 Messages : 9 050 ![]() |
|
|
|
10
|
|
|
#6 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Après avoir moi aussi tenté de créer mon moteur de template (j'ai réussi un truc pas mal d'ailleurs mais ce n'est pas la question) avec des méta-balises et un jeu d'instructions simple pour les boucles et les filtres, je me suis rendu compte qu'on ne pouvait pas aller plus vite que la bonne vieille méthode:
Code :
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||
|
11
|
|
|
#7 |
![]() ![]() Josselin Développeur Web Inscription : janvier 2004 Messages : 9 050 ![]() |
@Benjamin Delespierre : Je suis d'accord, mais dans mon cas c'était juste pour éviter aux intégrateurs de toucher au PHP, de faire des boucles for() au lieu de foreach() pour parcourir un tableau par exemple.
Pour moi tout seul, je mélange le HTML et le PHP sans problème. |
|
|
10
|
|
|
#8 | |||||||
|
Membre actif
![]() Inscription : mai 2003 Messages : 133 ![]() |
Citation:
Mettons que tu as une chaîne: où tu fais une capture avec (en mode gourmand) Il va d'abord capturer { Puis le plus de lettres quelconques possibles (.+) Et essayer de capturer }, ce qui va échouer (puisqu'il n'y a plus de lettre). Il va ensuite essayer de faire un retour (backtrace), une lettre à la fois, et tenter de capturer à nouveau }. Code :
Si tu utilise une expression non gourmade: … il va faire le chemin inverse Code :
Et pour ce qui est du modificateur U en fin de regexp, je le déconseillerais: il est plus intéressant de changer la gourmandise de chaque quantificateur individuellement que de modifier le comportement général du moteur. Qui plus est, cette syntaxe (U) est propre à PCRE, là où les quantificateurs +?, *?, {}? fonctionnent quasi partout (PCRE, Perl, Oniguruma, etc.). Et pour ce qui est de la regex qui nous occupe, j'utiliserais: Code :
|
|||||||
|
|
30
|
|
|
#9 |
![]() ![]() Josselin Développeur Web Inscription : janvier 2004 Messages : 9 050 ![]() |
@Causa Sui : Merci pour ton explication détaillée !
Concernant mon problème original, je m'étais un peu fourvoyé lors de la conception du pattern. En effet, je l'avais fait totalement généraliste, alors qu'il s'agit finalement de la syntaxe des variables PHP. J'ai pris simplement la syntaxe proposée par Shikiryu : preg_replace( '/{:([a-zA-Z]+):}/e', "$\\1", $html ); à laquelle j'ai rajouté l'underscore et les chiffres. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com