|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre Expert
![]() Baptiste ROUSSELÉtudiant Inscription : janvier 2011 Messages : 802 ![]() |
Il y a des temps où les données sont à formater, extraire et j'en passe. Or je rencontre énormément de développeurs qui tombent à bras raccourcis sur les expressions régulières et leur lourdes fonctions de traitement pour régler ces problèmes ?!
Il existe bon nombre d'outils pour résoudre des problèmes et dans certains cas les regex sont à bannir et je dirai même à enterrer vivant dans le jardin de votre grand mère ! (Je vous demanderai de ne pas aller regarder ce qui se trouve sous les pétunias de ma mamie... ) Parser du HTML/XML à coup d'expressions régulières ? Certes ça tient en moins de ligne que d'utiliser DOM ou autre... Mais niveau performance... Hein ? Ou bien encore un cas que j'ai vu ce matin ! Comment échapper des caractères indésirables ?! Allez hop un coup de preg_replace avec le motif qui va bien ! ![]() Non mais oh ! Faudrait penser à essayer d'arrêter l'hémorragie avec autre chose qu'une tronçonneuse... ![]()
__________________
|
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
si on connait bien tout ça et que ça ne suffit pas on peut se permettre d'utiliser les regex trop de "débutants" essaient sans comprendre les regex à tord et à travers comme solution pseudo miracle à leurs problèmes. Et je pense que y'a une réel sensibilisation à faire la dessus. On utilise les bon outils en premier, on optimise après.
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#3 |
![]() ![]() Développeur Web Inscription : août 2006 Messages : 2 700 ![]() |
Cela dépend du besoin, parce que parfois une bonne petite regex est plus pratique à utiliser que SimpleXML par exemple.
Entre instantier un simpleXmlElement, lui appliquer la méthode xpath et enfin caster le résultat en string juste pour avoir un titre par exemple, c'est overkill par rapport à une regex bien construite, voire même un simple strstr.
__________________
|
|
|
21
|
|
|
#4 | |||
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
Citation:
je vois pas en quoi c'est "overkill" de faire Code :
__________________
http://blog.stealth35.com/ |
|||
|
|
00
|
|
|
#5 | ||||
![]() ![]() Développeur Web Inscription : août 2006 Messages : 2 700 ![]() |
Citation:
Tu as d'ailleurs eu une très bonne citation : Citation:
C'est un peu comme php, qui a (avait, j'espère) la réputation d'un langage de bidouille surtout parce qu'il a été utilisé par des bidouilleurs.
__________________
|
||||
|
|
10
|
|
|
#6 | |
|
Membre Expert
![]() Baptiste ROUSSELÉtudiant Inscription : janvier 2011 Messages : 802 ![]() |
Citation:
De plus je rejoins Stealth35... Quand vous aurez une application qui explose la mémoire du serveur et qui est trop longue d'exécution vous y reviendrez à remplacer vos regex, donc autant prendre de bonnes habitudes dès le début et les utiliser comme il se doit. On est pas en train de dire que les regex c'est le mal, on est en train de dire que les regex à toutes les sauces c'est mal... C'est comme de tartiner de nutella tout ce que vous mangez parce que le nutella c'est bon... Vous avez déjà testé un filet mignon au nutella ? Personnellement j'ai eu à reprendre des applications où les gars avaient fait tous leur tests avec des regex... Vous trouvez sérieusement que ceci est optimisé : Code php :
if( preg_match('/^([0-9]+$/',$chaine) ) J'ai envie de vomir quand je vois ça personnellement.
__________________
|
|
|
|
01
|
|
|
#7 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
une méthode simple pour bien connaitre PHP
http://php.net/manual/en/indexes.php a chaque fonctions que vous ne connaissez pas, aller à quoi elle correspond
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#8 | |
|
Membre chevronné
![]() Développeur Web Inscription : mars 2011 Messages : 399 ![]() |
Citation:
Bref, +1 pour les bons outils au bon moment et d'éviter les regex
__________________
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... |
|
|
10
|
|
|
#9 | ||
![]() ![]() Développeur Web Inscription : août 2006 Messages : 2 700 ![]() |
On ne peut plus vrai !
C'est d'ailleurs un conseil que je donne : toujours envisager strstr avant de se lancer dans les regex Citation:
Citation:
Quelle est votre méthode ?
__________________
|
||
|
|
00
|
|
|
#10 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
is_numeric, ou filter_var avec FILTER_VALIDATE_INT
__________________
http://blog.stealth35.com/ |
|
|
10
|
|
|
#11 |
![]() ![]() Développeur Web Inscription : août 2006 Messages : 2 700 ![]() |
is_numeric ne peut convenir seul du fait de la grande variété de valeurs qu'ils considèrent numériques.
FILTER_VALIDATE_INT est un bien meilleur choix, mais êtes vous sûr qu'il ne valide pas les entiers négatifs si on ne lui adjoint pas des options ? Honnêtement, je ne m'en rappelle plus, mais quoi qu'il en soit, filter_var est une excellente fonction dont il ne faut pas hésiter à abuser. Mais de là à vomir sur le simple /^[0-9]+$/ qui présente l'avantage d'annoncer clairement l'intervalle validé, il ne faut pas pousser. Comme au niveau perfs, on doit en être à la microseconde, non ? Et si on prend le temps d'une optimisation triviale du genre /^[0-9]+$/S ça ne me semble pas si moche.
__________________
|
|
|
10
|
|
|
#12 |
|
Membre chevronné
![]() Développeur Web Inscription : mars 2011 Messages : 399 ![]() |
+1 pour is_numeric() quand on voit que '1e4' est de type numérique (pour PHP).
Par contre, clairement, je préfère utilisé un filter_var() plutôt qu'une regex, ne serait-ce que pour la clarté du code. Après, c'est sûr, celle-ci n'est pas la pire regex mais c'est un peu sortir l'artillerie pour pas grand chose. /^\d+$/S est super clair
__________________
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... |
|
00
|
|
|
#13 | |
![]() ![]() Développeur Web Inscription : août 2006 Messages : 2 700 ![]() |
Citation:
Es-tu sûr que FILTER_VALIDATE_INT ne valide pas les négatifs ? (joues le jeu, ne regarde pas la doc )L'intervalle [0-9]+ est clair, net et précis. Aucune ambiguité. Alors lequel est le plus clair ?
__________________
|
|
|
|
00
|
|
|
#14 | |||
|
Membre Expert
![]() Baptiste ROUSSELÉtudiant Inscription : janvier 2011 Messages : 802 ![]() |
Citation:
Code php :
Et en terme de performance c'est bien plus rapide qu'une regex.
__________________
|
|||
|
|
00
|
|
|
#15 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
oui mais (y'a toujours un mais) \d valider tout les autres caractères du type digit donc en utf-8 ou suivant la locale : cette chaine est valide :
٢0߅߉৬৯5
__________________
http://blog.stealth35.com/ |
|
|
10
|
|
|
#16 | |||
![]() ![]() Développeur Web Inscription : août 2006 Messages : 2 700 ![]() |
Citation:
Je veux juste jouer à l'avocat du diable... C'est à dire, tu peux nous donner un ordre d'idée ou un benchmark ?
__________________
|
|||
|
|
00
|
|
|
#17 |
|
Membre Expert
![]() Baptiste ROUSSELÉtudiant Inscription : janvier 2011 Messages : 802 ![]() |
Ah beh zut... Vais retourner ma veste et tout faire en Regex moi maintenant.
![]() Les tests suivants proviennent d'un test sur 20 000 itérations sur chaque fonction. Dans l'ordre suivant : filter_var(tel que je l'ai présenté), regex (/^[0-9]+$/), regex (/^[0-9]+$/S). 2.394325E-5 2.303855E-5 2.222855E-5 Et un second jet 2.3857849999999E-5 2.35077E-5 2.297965E-5 La seule chose que j'ai pu remarqué au travers des tests c'est que le temps moyen du filter_var ne variait que très peu alors que pour les regex c'était très élastique (sans pour autant dépasser le filter_var). ![]() Par contre si on ne rajoute pas d'option (vérification des positifs) la fonction filter_var devient plus rapide. 2.059795E-5 2.39526E-5 2.3214E-5 Comble du malheur par contre on inverse la donne en recherchant des nombres quelconques ou strictement négatifs. 1.819712E-5 2.610805E-5 2.614045E-5 A noter que la solution suivante est la plus rapide de toute : Code php :
if( is_numeric($nombre) && $nombre >= 0 )
__________________
|
|
|
00
|
|
|
#18 |
![]() ![]() Développeur Web Inscription : août 2006 Messages : 2 700 ![]() |
CQFD.
Et pourtant, dans un cas pareil, j'utiliserais quand même var_filter, car il est très lisible. Ceci dit, tu devrais faire quelque chose pour tes maux d'estomac...
__________________
|
|
|
00
|
|
|
#19 | |
![]() ![]() Développeur Web Inscription : août 2006 Messages : 2 700 ![]() |
Citation:
Note pour les benchs : il faut tester un cas qui marche ET un cas qui ne marche pas. Si j'ai le temps, je vais le faire, par curiosité.
__________________
|
|
|
|
01
|
|
|
#20 |
|
Membre actif
![]() Inscription : février 2009 Messages : 150 ![]() |
Salut,
filter_var n'est surement pas une bonne solution niveau performance. Il vaut mieux une fonction "spécifique" selon ce que vous voulez traiter. Par exemple, on va pas faire une regex ou un filtervar pour tester q'une variable est vide, ou qu'elle est bien égale à un entier. Pour l'histoire is_numeric sur entier, je recommande cette manière : Mais normalement la var est deja définie avant en entier, donc un simple if($entier > 0) suffit. Sinon pour les cas avec == ou >=, utilisez les en strictement, genre === ou >==, refait tes bench avec ça transgohan, tu va voir la diff encore Bon biensure il faut avoir bien réglé le type de ses variables... et c'est la qu'on trouvera aussi un gain, avec notre php soit disant pas typé... Sur chiffre à virgule ("point" plutot), j'utilise ce controle la sur le chiffre qui est envoyé : Code :
$chiffre = floatval(str_replace(',','.',$chiffre)); |
|
|
01
|
Copyright © 2000-2012 - www.developpez.com