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 :

Écrire une regexp


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Janvier 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2013
    Messages : 48
    Points : 27
    Points
    27
    Par défaut Écrire une regexp
    Bonjour !

    Je veux extraire d'un très long texte des éléments qui y sont toujours présentés de la même manière.
    Donc, je voudrais savoir comment écrire et utliser une regexp qui répondrait au modèle (pattern) suivant :

    - un premier groupe de caractères (pouvant comporter, outre des lettres : un ou des espaces le(s)quel(s) toujours suivi(s) d'une lettre et comportant aussi, éventuellement, une ou des apostrophes ainsi que un ou des tirets mais jamais de chiffres)
    - un espace toujours suivi d'un chiffre (bon repère médian, comme une sorte de "delimiter")
    - un second groupe de caractères (chiffres et tiret (et/ou un point d'interrogation sur les modèles suivants : 1234-5678 ou 1234-?)

    Exemples :

    Saint-Denis l'Église 1234-?

    ou

    L'Arbresle-sur-le-Lac 2345-6789

    Cette regexp serait utilisée dans un script PHP, pour extraire les éléments d'un texte réparti dans les multiples rangées d'une colonne de table MySQL.

    Merci d'avance pour votre aide et/ou vos explications !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu aurais pu essayer quelque chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #([[:alpha:]-\'\s]+) ([0-9]+)-([0-9]+|\?)#
    même une version laxiste peut répondre à ton besoin
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Janvier 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2013
    Messages : 48
    Points : 27
    Points
    27
    Par défaut
    Merci beaucoup, "sabotage" !

    Je viens juste de commencer à apprendre sur le site http://www.expreg.com/
    et je vais déchiffrer ce que tu me proposes.

    Vois-tu, j'aime comprendre ce que j'utilise...

    :-)

    Petite question :
    Sur le site de MySQL, ils disent utiliser les POSIX alors que partout on conseille les PCRE.
    Comme je suis un parfait novice, comment choisir ?

  4. #4
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    avec l'api preg_xxx (car ça change le codage de certains trucs sinon):
    si tu veux les nombres de l'expression:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    "`([0-9]{4})\-([0-9]{4})|\?`"

    `` délimite le motif derrière tu peux mettre des options pour la casse, etc...

    () délimite une saisie (retournée dans le tableau en sortie de la fonction) mais sert aussi à définir une priorité niveau opérateur (un groupe)

    \ permet d'échapper les caractères ayant un sens particulier au niveau du motif pour les utiliser comme des caractères normaux

    {x} ou {x,y} nombres définissant la répétition attendue du caractère ou groupe précédent
    ? correspond à {0,} c'est à dire présence possible
    [a-zA-Z0-9\?] défini un ensemble de caractère pour le caractère courant
    [^a-zA-Z0-9\?] définit un ensemble de caractères interdits pour le caractère courant

    tu peux mettre des ancres:
    • `^ début de chaine
    • $` fin de chaine


    voilà un résumé rapide, je t'invite à lire la doc et tu trouveras moult cours en parlant

    dans php n'utilise que des preg_..., les erg_... vont disparaitre

    un outil en ligne pour tester: ici

    dedans tu mets ce qu'il y a entre les ``, ici:
    ([0-9]{4})\-([0-9]{4})|\?
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Janvier 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2013
    Messages : 48
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Tu aurais pu essayer quelque chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #([[:alpha:]-\'\s]+) ([0-9]+)-([0-9]+|\?)#
    Bonjour !

    J'ai testé le code dans phpMyAdmin avec une requête SQL,
    j'ai obtenu un message d'erreur :
    #1139 - Got error 'invalid character range' from regexp

    Pourtant, j'ai testé ([[:alpha:]-\É\é\è\'\s]+) ([0-9]+)-([0-9]+|\?) avec l'outil fourni par eric69 http://www.google.com/url?q=http%3A%...RnkhKpZbX-6-Kg et ça fonctionne.
    (regexp modifiée pour prendre en compte les lettres accentuées pouvant être rencontrées car l'original les ignorait)

    Y'a un os quelque part...

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Met [a-zA-Z] au lieu de [:alpha:] alors
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Janvier 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2013
    Messages : 48
    Points : 27
    Points
    27
    Par défaut
    Ça ne change que le message d'erreur :
    #1139 - Got error 'repetition-operator operand invalid' from regexp
    Ma requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ID, longName, notes
    FROM `_a_listregex`
    WHERE notes REGEXP '([[a-zA-Z]-\'\s]+) ([0-9]+)-([0-9]+|\?)'
    ORDER BY ID

  8. #8
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    oui car c'est du posix et surtout une chaine simple...
    essaye de doubler le \ devant ?
    car quand tu envoie la requête via php elle est echappée... du coup, il interprète le ? comme un répétiteur (équivaut à {0,})...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Janvier 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2013
    Messages : 48
    Points : 27
    Points
    27
    Par défaut
    Bonjour Eric !

    Merci pour ton temps.

    C'est fait.
    Résultat : Je n'ai plus de message d'erreur, la requête s'exécute, MAIS le résultat est :

    MySQL returned an empty result set (i.e. zero rows). ( Query took 0.6228 sec )

    Autrement dit, la regexp est "annihilée", inefficace...

    J'ai remarqué que si, dans ma requête, je supprime les ' autour de la regexp, phpMyAdmin (qui colore les requêtes pour nous aider et signaler les erreurs de syntaxe) ne colore pas la regexp du "vert" attendu mais laisse supposer une erreur au premier tiret dans la regexp... Je ne sais interpréter ce signal...

    Mais il est évident que si je supprime les ' autour de la regexp, la requête devient fausse et conduit à une erreur.
    Peut-être est-ce simplement de cela que l'interface veut me prévenir...

    Dans un autre ordre d'idées, j'ai bien ri en lisant dans ton texte :
    « et surtout une chaine simple... » !!!
    Ouf ! C'est quoi une chaîne compliquée ?


  10. #10
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Tu mets une classe dans une classe ?
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Janvier 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2013
    Messages : 48
    Points : 27
    Points
    27
    Par défaut
    Merci ! Tu as mis le doigt dessus !

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ID, longName, notes
    FROM `_a_listregex`
    WHERE notes REGEXP '([a-zA-Z][-\'\s]+) ([0-9]+)-([0-9]+|\\?)'
    ORDER BY ID

    Ça fonctionne dans phpMyAdmin !
    Mais surtout, j'ai compris.


    SAUF QUE :

    La regexp ne passe plus le test (http://www.annuaire-info.com/outil-r...ion-reguliere/) et retourne des "faux" pour les cinq textes soumis alors qu'elle en retournait à juste titre trois vrais et deux faux comme attendu.


  12. #12
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    moi ça me renvoie 1 avec:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select "L'Arbresle-sur-le-Lac 2345-6789" regexp "[0-9]{4}\-[0-9]{4}|\\?";
    et l'erreur de répétition avec:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select "L'Arbresle-sur-le-Lac 2345-6789" regexp "[0-9]{4}\-[0-9]{4}|\?";
    c'est bien la solution qui marche avec des outils qui agisse comme la console sans échapper...

    phpmyadmin dans la version 3.5.1 ça marche aussi
    essaye:
    envoie ta requête sans l'échapper pour voir ou teste la en console si tu peux ou avec heidisql tu peux te connecter sur une bd distante via ssh ou tcp/ip selon ce que tu as droit...
    car on doit avoir \\ à la fin après échappement
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Janvier 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2013
    Messages : 48
    Points : 27
    Points
    27
    Par défaut
    Modifié la regexp ainsi :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ID, longName, notes
    FROM `_a_listregex`
    WHERE notes REGEXP '([a-zA-Z-\'\s]+) ([0-9]+)-([0-9]+|\\?)'
    ORDER BY ID

    Elle passe le test mais pas la requête dans phpMyAdmin !!!
    (#1139 - Got error 'invalid character range' from regexp)

    Histoire de fous...
    Grrrr...

  14. #14
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ([a-zA-Z\-Ééè\'\s]+) ([0-9]+)-([0-9]+|\\?)
    Non ?
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Janvier 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2013
    Messages : 48
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ([a-zA-Z\-Ééè'\s]+) ([0-9]+)-([0-9]+|\\?)
    Non ?
    Oui pour le test (url déjà citée).

    Non pour phpMyAdmin 3.5.6
    (#1139 - Got error 'invalid character range' from regexp)

  16. #16
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    oui seul les caractères spéciaux sont à échapper \- ou \' (si tu n'utilise pas ""autor de la regex) dans ta classe pas les é...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Janvier 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2013
    Messages : 48
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    oui seul les caractères spéciaux sont à échapper \- ou \' (si tu n'utilise pas ""autour de la regex) dans ta classe pas les é...
    Eh non...
    Si :
    1 - je n'utilise pas de ' ou de "
    2 - je retire les lettres accentuées mais en conservant les caractères spéciaux

    la requête ne fonctionne pas dans phpMyAdmin.

    Les ' ou les " sont indispensables pour que la requête fonctionne dans phpMyAdmin.

  18. #18
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    faut pas les retirer

    je te disais juste que tu n'es pas obliger d'échapper dans la regex mysql ' si elle est encadrée par "" ou inversement...

    par contre, il me semble que tu es obligé de doubler tous les \ dans la version mysql par rapport à celle de php

    l'outil est compatible avec les preg_xxx de php
    phpmyadmin se comporte comme mysql
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Janvier 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2013
    Messages : 48
    Points : 27
    Points
    27
    Par défaut
    C'est ce que j'ai fait avec :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ID, longName, notes
    FROM `_a_listregex`
    WHERE notes REGEXP '([a-zA-Z][\-\'\s]+) ([0-9]+)-([0-9]+|\\?)'
    ORDER BY ID

    qui fonctionne, mais pas bien ainsi que tu vas le constater avec ce qui suit.

    Le problème se déplace.
    Alors que j'attendais aux environs de 2500 résultats au moins, je n'en obtiens que 840.
    Pourquoi ? Je n'en sais rien.
    Et là, je pense qu'il va falloir que je trouve seul la raison.

  20. #20
    Nouveau membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Janvier 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2013
    Messages : 48
    Points : 27
    Points
    27
    Par défaut
    Bonjour !

    Est-ce que l'un d'entre vous aurait une idée de la raison pour laquelle le résultat obtenu est inférieur aux attentes ?
    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '(([a-zA-Z][\-\É\é\è\'\s]+) ([0-9]+)-([0-9]+|\\?))+'
    mais ça n'a rien donné

    J'aimerais aussi savoir comment rédiger ma requête pour qu'elle me retourne uniquement les chaînes correspondant à la regexp et non la totalité du champ 'notes'...

    Merci, Bovino, pour les remarques et conseils !

Discussions similaires

  1. [Regex]Match d'une regexp avec une chaîne avec caractères spéciaux
    Par gdawirs dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 25/11/2005, 12h24
  2. Comment écrire une très longue variable dans un fichier ?
    Par hijodelanoche dans le forum Langage
    Réponses: 8
    Dernier message: 17/11/2005, 16h12
  3. [C#][xml][regexp] Recherche d'une regexp dans un fichier xml
    Par LeJocker dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/10/2005, 12h29
  4. [Regexp] Obtenir une regexp à partir du texte ?
    Par Alec6 dans le forum Langage
    Réponses: 1
    Dernier message: 12/09/2005, 16h40
  5. écrire une DTD pour un article
    Par VincentMetz dans le forum Valider
    Réponses: 4
    Dernier message: 19/07/2004, 11h32

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