Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/06/2011, 08h13   #1
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
Par défaut L'art de l'expression régulière !

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...
  • Et vous, qu'en pensez-vous ?
  • Vous jetez-vous sur les expressions régulières pour résoudre un problème avant de penser à autre chose ?
  • Avez-vous vu des cas effarants où l'utilisation de regex était un gouffre de temps pour rien ?
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 09h59   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
  • parser du DOM : DOMDocument, SimpleXML
  • parser du texte formater : sscanf
  • parser un date : strtotime, strptime, date_parse_form_format
  • parser une URL : parse_url (+ parse_str)
  • valider un mail : filter_var + FILTER_VALIDATE_EMAIL
  • supprimer les caractères spéciaux : filter_var + FILTER_SANITIZE_STRING + (FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH)

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/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 19h33   #3
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
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.
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 21
Vieux 21/06/2011, 20h06   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
Citation:
Envoyé par s.n.a.f.u Voir le message
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.
c'est un faux probleme, un getElementById est bien plus simple a comprendre que le regex qui va avec, je ne pense pas que t'utilises les regex pour parcourir ton DOM en javascript ? alors pourquoi en PHP ça ne serai pas la même chose ?

je vois pas en quoi c'est "overkill" de faire

Code :
1
2
3
4
5
6
7
 
$doc = new DomDocument();
$doc->loadHTMLFile($url);
 
echo $doc->getElementById('truc')->nodeValue;
 
//temps passé 5 sec, bon courage pour le trouver le bon regex en 5 secondes
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 23h21   #5
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Citation:
Envoyé par stealth35 Voir le message
c'est un faux probleme, un getElementById est bien plus simple a comprendre que le regex qui va avec, je ne pense pas que t'utilises les regex pour parcourir ton DOM en javascript ? alors pourquoi en PHP ça ne serai pas la même chose ?

je vois pas en quoi c'est "overkill" de faire

Code :
1
2
3
4
5
6
7
 
$doc = new DomDocument();
$doc->loadHTMLFile($url);
 
echo $doc->getElementById('truc')->nodeValue;
 
//temps passé 5 sec, bon courage pour le trouver le bon regex en 5 secondes
En l’occurrence, il ne me faudrait pas beaucoup plus que 5 secondes, mais ta solution est quand même meilleure.

Tu as d'ailleurs eu une très bonne citation :
Citation:
trop de "débutants" essaient sans comprendre les regex à tord et à travers comme solution pseudo miracle à leurs problèmes.
S'il est vrai qu'il faut évaluer d'autres outils que les regex avant de les utiliser, je voulais juste dire pour leur défense qu'elles ont une mauvaise réputation surtout parce qu'elles sont mal codées.
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.
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/06/2011, 08h08   #6
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
Citation:
Envoyé par s.n.a.f.u Voir le message
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.
S'il est possible d'utiliser strtr ton regex tu peux le jeter.
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.
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 22/06/2011, 09h59   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
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/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 11h56   #8
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
Citation:
Envoyé par transgohan Voir le message
Code php :
if( preg_match('/^([0-9]+$/',$chaine) )
???
J'ai envie de vomir quand je vois ça personnellement.
Surtout qu'elle est erronée. Manque une parenthèse fermante.

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...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/06/2011, 19h06   #9
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Citation:
Envoyé par transgohan Voir le message
S'il est possible d'utiliser strtr ton regex tu peux le jeter.
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:
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 ?
+1

Citation:
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.
A part l'erreur de parenthèse qui est juste une faute de frappe, en quoi cette expression est-elle si horrible ?
Quelle est votre méthode ?
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 19h23   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
Citation:
Envoyé par s.n.a.f.u Voir le message
A part l'erreur de parenthèse qui est juste une faute de frappe, en quoi cette expression est-elle si horrible ?
Quelle est votre méthode ?
is_numeric, ou filter_var avec FILTER_VALIDATE_INT
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/06/2011, 20h03   #11
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Citation:
Envoyé par stealth35 Voir le message
is_numeric, ou filter_var avec FILTER_VALIDATE_INT
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.
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/06/2011, 20h55   #12
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
+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...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 21h03   #13
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Citation:
Envoyé par Shikiryu Voir le message
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.
Encore une fois, au niveau clarté, je ne sais pas lequel est le meilleur.
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 ?
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 08h12   #14
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
Citation:
Envoyé par s.n.a.f.u Voir le message
Encore une fois, au niveau clarté, je ne sais pas lequel est le meilleur.
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 ?
Un exemple avec filter_var pour tester les entiers non négatifs :
Code php :
1
2
if( filter_var($entier, FILTER_VALIDATE_INT, array('options' => array('min_range' => 0))) )
  echo $entier . 'est un entier positif.';
Et on peut faire des choses encore plus compliquées avec cette fonction.
Et en terme de performance c'est bien plus rapide qu'une regex.
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 10h00   #15
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
Citation:
Envoyé par Shikiryu Voir le message
/^\d+$/S est super clair
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/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/06/2011, 13h34   #16
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Citation:
Envoyé par transgohan Voir le message
Un exemple avec filter_var pour tester les entiers non négatifs :
Code php :
1
2
if( filter_var($entier, FILTER_VALIDATE_INT, array('options' => array('min_range' => 0))) )
  echo $entier . 'est un entier positif.';
Et on peut faire des choses encore plus compliquées avec cette fonction.
Je suis moi aussi un grand fan de cette fonction.
Je veux juste jouer à l'avocat du diable...

Citation:
Envoyé par transgohan Voir le message
Et en terme de performance c'est bien plus rapide qu'une regex.
C'est à dire, tu peux nous donner un ordre d'idée ou un benchmark ?
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 15h22   #17
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
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 )
1.6809749999999E-5
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 19h13   #18
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
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...
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 20h26   #19
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Citation:
Envoyé par transgohan Voir le message
A noter que la solution suivante est la plus rapide de toute :
Code php :
if( is_numeric($nombre) && $nombre >= 0 )
1.6809749999999E-5
Mais elle ne convient pas : cas du 1.5

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é.
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 24/06/2011, 11h25   #20
Membre actif
 
Inscription : février 2009
Messages : 150
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 150
Points : 198
Points : 198
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 :
Code :
if(intval($entier) > 0) {
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));
nextdev est déconnecté   Envoyer un message privé Réponse avec citation 01
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h41.


 
 
 
 
Partenaires

Hébergement Web