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 :

Regex PCRE : Match un type string [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 22
    Points : 10
    Points
    10
    Par défaut Regex PCRE : Match un type string
    Bonjour tout le monde,

    Je suis actuellement en train de réalisé en binôme une application en PHP CLI qui a pour but de... refaire un SGBDR.

    Pour ça, nous en venons bien évidemment à vérifier la syntaxe des requêtes saisies par l'utilisateur, notamment lorsqu'il saisit une chaîne de caractère ! (nous devons gérer le type, mais pas la taille des champs)

    Les contraintes :
    Une chaîne de caractère d'un seul mot n'est pas forcément entourée de "
    Une chaîne de caractères entourée de " peut accepter n'importe quelle valeur de n'importe quelle t'aille, y comprit les " échappés (\")

    Voici la regex que j'ai actuellement pour valider cette syntaxe (qui ne marche pas bien évidemment, d'où mon problème)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern_string = '((".*?[^\\]")|([^\., \)]+))';
    Dans la partie du mot seul, je dis que j'ai besoin de n'importe quel caractères exceptés :
    le point (qui n'existera que si on me spécifie une table.champ)
    La virgule, l'espace, la parenthèse fermante : Ce sont des seuls caractères qui me permettent de savoir que ma valeur se termine pour continuer ma requête.

    Comment puis-je faire en sorte de pouvoir donc valider une chaine de caractères entourés de doubles-quotes pouvant contenir des doubles-quotes échappées svp ?

    Merci d'avance...
    V3lkin.

  2. #2
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 123
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par V3lkin Voir le message
    Bonjour tout le monde,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern_string = '((".*?[^\\]")|([^\., \)]+))';
    Comment puis-je faire en sorte de pouvoir donc valider une chaine de caractères entourés de doubles-quotes pouvant contenir des doubles-quotes échappées svp ?
    V3lkin.
    Bonjour,
    si j'ai bien compris ta question je crois qu' il faut faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern_string = '#\"(.*)\"#';
    bonne chance

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par saramery Voir le message
    Bonjour,
    si j'ai bien compris ta question je crois qu' il faut faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern_string = '#\"(.*)\"#';
    bonne chance
    Hmmm, le problème vient du fait que ce pattern est destiné à être inclus dans un pattern bcp + grand.

    De plus... je ne sais pas ce que veulent dire les "#" ?? J'utilise des "/" pour délimiter mes patterns, ça change quelque chose ?

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 123
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par V3lkin Voir le message
    Hmmm, le problème vient du fait que ce pattern est destiné à être inclus dans un pattern bcp + grand.

    De plus... je ne sais pas ce que veulent dire les "#" ?? J'utilise des "/" pour délimiter mes patterns, ça change quelque chose ?
    le # c'est pour délimiter le pattern seulement

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    En tout cas le pattern n'est pas bon, car il devrait s'arrêter à la première double-quote (ce qui ne prend donc pas en compte l'échappement), de +, de cette façon, il ne s'arrêtera pas forcément à la première double-quote... :s

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 123
    Points : 55
    Points
    55
    Par défaut
    j'ai pas bien compris ta question mais il faut pas échapper les caractères qui se trouvent dans une classe[]

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Je vais donner un exemple :

    Requête de type "Insert"

    INSERT clients (
    id = 1,
    nom = jean,
    pnom = "Un prénom composé de plusieurs \"mots\"",
    age = 27
    );

    Dans le champ 'pnom', il faut bien que j'ai la valeur -> Un prénom composé de plusieurs "mots"

    lorsqu'il s'agit de vérifier la syntaxe, j'essaie de dire à ma regex de s'arrêter à la première double-quote qui n'est pas précédée d'un backslash.. ce qui semble bien, mais il faut aussi dire que ledit backslash, on ne pas le prendre en compte s'il est lui même précédé d'un backslash

    Exemple :

    "Il fait beau aujourd'hui \\" -> Il fait beau aujourd'hui \


    Oui je sais, c'est bizarre, mais ça marche tout ça quand l'écrit dans un SGBD, et ça doit faire pareil dans mon programme :s Et je n'y arrive pas T_T

    Enfin, déjà, merci à tous ceux qui ont répondu !

  8. #8
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 123
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par V3lkin Voir le message
    Bonjour,
    essaie ça il fonctionne chez moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "#\"|\'\/\"|\'(.*)\"|\'\/\"|\'#siU"
    j'espère que c'est ce que tu cherches

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Merci saramery, mais je dois avouer que ça ne marche pas chez moi :s

    J'ai trouvé (ou plutôt mon binôme a trouvé) le testeur de regex qu'il y a ici, j'y ai donc soumis mes regex et voici ce qu'il en ressors :
    Ma recherche de de valeur entres guillemets marche, c'est juste que maintenant, si on me passe une string sans guillet, ça ne marche plus.

    Exemples (requete INSERT) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT clients (
            id = 2,
            nom = dupond,
            pnom = "jean;\"pierre",
            age = 24
    );
    regex utilisee :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #insert\s+[a-zA-Z0-9_]+\s+\(\s*[a-zA-Z0-9_]+\s+=\s+([0-9]+|[0-9]+([\.,][0-9]+)|(true|false)|((".*?[^\]")|([^\., \)]+)))(\s*,\s*[a-zA-Z0-9_]+\s+=\s+([0-9]+|[0-9]+([\.,][0-9]+)|(true|false)|((".*?[^\]")|([^., \)]+))))*\s*\)\s*;#is
    Note : j'ai mit en rouge la syntaxe de verification d'une valeur de type string

    ca ne marche pas, mais si j'entoure dupond de guillemets, ca me valide ma chaine...

    Une idee ?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Bon... la solution était devant notre nez en fait :

    Je déclare cette regex dans une variable (en fait, dans plusieurs variables), mais bon, vu que je les concatène... ^^)

    Quand je veux que la regex ait dans son pattern "\\", il faut que quand je l'écrit dans une string, mette "\\\\" (pour échapper le backslash)

    Et voilà... c'était tout, tout passe.

    Voici donc le pattern pour trouver une valeur de type string dans une requête SQL type :

    $string_pattern = '#((".*?[^\\\\]")|([^\. ,\)]+))#si';

    Merci à toutes les personnes qui m'ont aidé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Type unit, type string, match with
    Par lioudow dans le forum Caml
    Réponses: 8
    Dernier message: 12/02/2007, 17h12
  2. Type String* en paramètre...
    Par Invité dans le forum MFC
    Réponses: 4
    Dernier message: 24/02/2004, 19h48
  3. Convertir une date en type string
    Par ziboux dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 29/10/2003, 10h52
  4. [VB6] creation de variable de type string dynamiquement
    Par da40 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 12/06/2003, 16h59
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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