Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
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 17/02/2006, 13h56   #1
Invité de passage
 
Inscription : février 2006
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 4
Points : 1
Points : 1
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 :
1
2
3
 
var1, 'exemple ' faux', var2
var1 , 'exemple \' ok' , var2
Sur la piste des assertions, j'ai écrit ceci :
Code :
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
xuoy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2006, 14h13   #2
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

J'aurais utilisé une autre approche : addslashes(stripslashes($string))...
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2006, 10h41   #3
Invité de passage
 
Inscription : février 2006
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 4
Points : 1
Points : 1
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 ?
xuoy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2006, 10h51   #4
Membre chevronné
 
Avatar de Kioob
 
Olivier Bonvalet
Inscription : septembre 2004
Messages : 550
Détails du profil
Informations personnelles :
Nom : Olivier Bonvalet
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : septembre 2004
Messages : 550
Points : 723
Points : 723
Envoyer un message via MSN à Kioob
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 ?
Kioob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2006, 11h18   #5
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
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.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2006, 11h19   #6
Membre chevronné
 
Avatar de Kioob
 
Olivier Bonvalet
Inscription : septembre 2004
Messages : 550
Détails du profil
Informations personnelles :
Nom : Olivier Bonvalet
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : septembre 2004
Messages : 550
Points : 723
Points : 723
Envoyer un message via MSN à Kioob
Nawak...
Kioob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2006, 11h29   #7
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
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.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2006, 11h33   #8
Membre chevronné
 
Avatar de Kioob
 
Olivier Bonvalet
Inscription : septembre 2004
Messages : 550
Détails du profil
Informations personnelles :
Nom : Olivier Bonvalet
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : septembre 2004
Messages : 550
Points : 723
Points : 723
Envoyer un message via MSN à Kioob
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é.
Kioob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2006, 11h59   #9
Invité de passage
 
Inscription : février 2006
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 4
Points : 1
Points : 1
Merci pour vos réponses,
j'ai trouvé ça qui répond à mes attentes pour le moment :
Code :
('(([^']|\\\\')*)(?<!\\\\)')
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
xuoy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h00.


 
 
 
 
Partenaires

Hébergement Web