Un regex qui tient compte des caractères d'échappement

Un regex qui tient compte des caractères d'échappement - PHP - Programmation

Marsh Posté le 18-02-2005 à 21:10:00    

Voilà en fait je travail sur un script de coloration syntaxique du code, qui permettrais également, entre autres, de détecter les erreurs les plus fréquentes.
 
Donc je me suis basé sur des choses élémentaires:
- Une parenthése ouvrante entraine un parenthése fermante.
- Une acollade ouvrante...
 
Donc un script qui compte les parenthèses dans le code saisi et qui fait la différence entre les deux est capable d'indiquer s'il en manque, logique.
 
Bon je parlais de coloration, et bien mon vrai problème c'est avec les caractéres d'échapement, parce qu'en fait je voudrais colorer les chaines qui se trouvent entre guillemets donc voici ma fonction:
 

Code :
  1. $str = preg_replace("#(&quot;.*?&quot;)#is","<font color=red>\\1</font>",$str);


 
Mais si comme code je met:
 

Code :
  1. echo "Hello le \"monde\"";


 
Et bien la coloration obtenue est la suivante:
 
echo "Hello le \"monde\"";
 
Logique me direz vous mais comment faire pour que cela ne se produise pas svp?


Message édité par dwogsi le 21-02-2005 à 18:44:37
Reply

Marsh Posté le 18-02-2005 à 21:10:00   

Reply

Marsh Posté le 18-02-2005 à 21:14:08    

en remplaçant .*? par .*
[:petrus75]
 
(c'est bien sûr une blagounette, je précise)
 
edit: plus sérieusement:
il faut utiliser une "negative lookbehind assertion" ( (?<!...) )
 
En gros, une regexp qui est initialement

\".*?\"


devient

\".*?((?<!\\)\" )


le 2e ' " ' ne match que s'il n'est pas précédé de ' \ '


Message édité par masklinn le 18-02-2005 à 21:25:44

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 21-02-2005 à 17:34:14    

Merci beaucoup ca marche maintenant!

Reply

Marsh Posté le 21-02-2005 à 18:46:33    

Bah en fait non correction, excusez moi...
Mais ca ne marche pas!
 
Je vous montre ma nouvelle fonction avec ma nouvelle expression régulière:
 

Code :
  1. $str = preg_replace("#(&quot;.*?((?<!\\))&quot;)#is","<font color=red>\\1</font>",$str);


 
Et voici l'erreur que j'ai:
Compilation failed: missing ) at offset 25
 
Donc j'ai bien compris que ca voulais dire qu'il manque une ) mais ou??? Moi je vois pas....

Reply

Marsh Posté le 21-02-2005 à 19:19:24    

Code :
  1. $str = preg_replace("#(&quot;.*?(?<!\\)&quot;)#is","<font color=red>\\1</font>",$str);


Reply

Marsh Posté le 21-02-2005 à 19:50:40    

Code :
  1. $str='echo "Hello le \"monde\"";';
  2. $str = preg_replace('#("(?:\\\.|[^\\\"])*?" )#is',"<span style='color:red;'>\\1</span>",$str);
  3. echo $str;


 
ca marche
source : http://www.regexlib.com/REDetails.aspx?regexp_id=355


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 22-02-2005 à 01:14:18    

Merci bien cette fois ci ca marche mais juste une petite dernière question avec des &quot; à la place des " ca donnerai quoi comme expression parceque pour le moment j'ai mit un str_replace pour remplacer les &quot; par un " mais je trouve pas ca trés top.

Reply

Marsh Posté le 22-02-2005 à 14:23:41    

oups celle que j'avais mis ne marche pas :(
qui sait comment on met un \ dans une assertion arriere ??

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed