IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

L'art de l'expression régulière !


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    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 ?

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    • 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.

  3. #3
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    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.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    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.

  6. #6
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    if( preg_match('/^([0-9]+$/',$chaine) )
    ???
    J'ai envie de vomir quand je vois ça personnellement.

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    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

  8. #8
    Membre émérite

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Par défaut
    Citation Envoyé par transgohan Voir le message
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  9. #9
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    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

    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

    Vous trouvez sérieusement que ceci est optimisé :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    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

Discussions similaires

  1. [RegEx] Expression régulières : Balises <SCRIPT>
    Par Gwipi dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2006, 23h25
  2. Expression réguliére
    Par Mad_Max dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 16/09/2003, 18h17
  3. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo