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 :

Assertion négative dans une classe


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 4
    Par défaut Assertion négative dans une classe
    Bonjour à tous,

    PHP5, expressions régulières compatibles perl.

    Je cherche à extraire d'une chaine une suite de caractère ne contenant pas le signe ' s'il n'est pas précédé d'un backslash
    autrement dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var1, 'exemple ' faux', var2
    var1 , 'exemple \' ok' , var2
    Sur la piste des assertions, j'ai écrit ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ('[^(?<!\\\\)']*')
    L'idée est de commencer le pattern par un simple quote, puis d'accepter un nombre quelconque de caractères n'étant pas un simple quote non précédé (vous suivez ?) par un backslash, puis je clos le pattern par un simple quote.
    Mais l'idée ne marchant pas, je voulais savoir si quelqu'un à déjà fait ce genre de manip
    Merci d'avance,
    youx

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    J'aurais utilisé une autre approche : addslashes(stripslashes($string))...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 4
    Par défaut
    Désolé, mais cela n'a rien à voir avec ma question : mon but est de pouvoir extraire les données comprises entre les simple quote quel que soit son contenu à partir du moment où il respecte une syntaxe juste pour un paramètre :
    param1, param2, param3 ... avec param2 = 'contenu \' correct' qui va être matché et param3 = 'contenu ' incorrect' qui ne sera pas matché en intégralité.
    Des idées ?

  4. #4
    Membre émérite
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Par défaut
    Hello,

    j'ai déjà fait ce genre de parseur, mais sans les expressions régulières... D'ailleurs si ton apostrophe est précédé d'un nombre pair de backslashs, il n'est pas échappé... et ça devient beaucoup trop complexe pour être gérable via les expressions régulières non ?

  5. #5
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Ouarf, ok, désolé pour le HS.
    Avec une regexp, je ne sais pas le faire. J'ai une autre méthode à te proposer : remplace les \' par un caractère (ou par une chaîne) qui n'existe pas dans ta chaîne source, parse-la, puis replace tes guillemets.

  6. #6
    Membre émérite
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Par défaut
    Nawak...

  7. #7
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Ouais, nawak, mais le problème me semble tordu à la base... C'est refaire le parseur de chaîne de PHP et je n'en vois pas trop l'intérêt : si c'est pour vérifier qu'un fichier texte contient des chaînes correctes, il y a sûrement moyen d'y arriver avec eval().
    J'essaie de proposer des solutions, quoi...

    Tiens, une autre : le problème des regexp (en relation avec le problème actuel) est qu'elles ne peuvent pas vérifier ce qu'il y a avant le caractère dont nous nous occupons. Une technique consisterait à inverser le texte et à le parser.

  8. #8
    Membre émérite
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Par défaut
    Le problème n'est pas tordu du tout, il s'agit d'un simple parseur... et il ne s'agit pas forcément d'un parseur PHP. Coté utilisation courrante, il y a par exemple les moteurs de templates, les "colorisateurs" de code, les parseurs Wiki, BB, etc. Et ce n'est certainement pas eval() qui remplira ce role.

    Quant au "problème" des regexp, bah si justement elles font ça très bien. Comme l'a dit xuoy, les assertions négatives servent justement à ça. Il se trouve juste que dans son cas cela ne me semble pas adapté.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 4
    Par défaut
    Merci pour vos réponses,
    j'ai trouvé ça qui répond à mes attentes pour le moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ('(([^']|\\\\')*)(?<!\\\\)')
    Visiblement, le nombre de backslash ne pose pas problème et vu que mon parser teste la longueur des elements matchés pour voir si la phrase donnée en paramètre est bien formée, ça roule en l'état.
    Pour répondre à kirkis, la solution du caractère à remplacer est pratique, facile à mettre en place, et c'est un hack que je cherche à éviter (au stade où en est mon dev, si je commence comme ça, ça risque d'être le foutoir en phase finale )
    Je ne me suis pas vraiment penché sur la question, mais quelqu'un connait-il un vrai parser en php qui me permette de définir mon langage puis de l'utiliser ensuite ?
    xoyu

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/07/2005, 23h10
  2. classe dans une classe ?
    Par tut dans le forum UML
    Réponses: 23
    Dernier message: 25/06/2004, 15h00
  3. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15
  4. Thread dans une classe ?
    Par Sephi dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 07/03/2004, 18h16
  5. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42

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