Coloration et regex, marche comme ca veux

Coloration et regex, marche comme ca veux - PHP - Programmation

Marsh Posté le 04-11-2005 à 14:39:37    

Salut la companie!
Bon alors voilà j'ai un problème de regex dont je viens juste de rendre compte alors que ca doit faire au moins 6 mois que je l'utilise.
 
En fait j'essais de créer une fonction de coloration syntaxique du code, qui ne fonctionnerait pas qu'avec du php mais aussi avec d'autres langages en détectant selon les mots clé utilisés de quel langage il s'agit.
 
Bref venons en au fait.
J'ai le code suivant :

Code :
  1. $str = preg_replace("#(//.*?\n)#i", "<span style=\"color:blue;\">\\1</span>", $str);


Qui est donc destionné à me donner ca :
// Commentaires en bleu
 
Bon pas de problème avec l'exemple ci-dessus ca marche.
Mais si dans $str je passe le texte suivant :
$img = ImageCreateFromGif("http://fr.php.net/images/php.gif" ); // Commentaire sur la même ligne
 
J'obtients :
$img = ImageCreateFromGif("http://fr.php.net/images/php.gif"); // Commentaire sur la même ligne
 
Donc ce qui ne va pas c'est que peu importe où se trouve les // ca passe quand même en bleu...
Pour les autres couleurs, je fais la coloration des chaînes en rouge et du reste du code en vert.
J'ais essayé des tonnes de regex, plein de tentative, tout ce que j'ai réussi à obtennir c'est des jolie arc en ciel pour ainsi dire.
 
Alors si quelq'un peut me donner un peu d'aide? Parce que je m'arrache les cheveux la dessus depuis un bon moment (même au boulo!) sans trouver de solution...........
 
En vous remerciant!  :)
 
[edit]
Je vois qu'il y a le même problème sur le forum HFR!


Message édité par dwogsi le 04-11-2005 à 14:57:21

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 04-11-2005 à 14:39:37   

Reply

Marsh Posté le 04-11-2005 à 14:45:50    

ben les regex, c'est vraiment pas mon truc, donc je vais pas t'être d'une grande aide...
 
le seul truc que je vois, c'est qu'il n'y a qu'un cas en dehors des commentaires ou tu va avoir "//", c'est au début d'une URL, et dans ce cas bien précis, ça sera tjs précédé de ":" (enfin de "http:" plus exactement), donc je sais pas si t'a moyen de bidouiller autour de ça...  :??:


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 04-11-2005 à 14:50:25    

C'est dingue j'y avais même pas pensé, ceci dit si on passe dans la chaine le code suivant :
echo "// Hey!!!! \\\\";
 
Bah ca merde encore, alors ta solution pourrait effectivement m'avancer mais peut être pas suffisament.
 
[edit]
En même temps faut penser au http, ftp, https, etc...


Message édité par dwogsi le 04-11-2005 à 14:51:10

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 04-11-2005 à 14:57:17    

Je suis en train de regarder les positives de prévision, genre pour vérifier qu'il n'y a pas de guillemet suivant le commentaire, mais ce n'est pas suffisant encore, ça n'éliminera pas encore tous les problèmes.
 
 
EDIT : en fait pas besoin de ces positives, on peut utiliser un truc dans ce goût-là :
"#(//[^\"]*?\n)#i"
(si je me plante pas)


Message édité par Elmoricq le 04-11-2005 à 15:00:36
Reply

Marsh Posté le 04-11-2005 à 14:59:19    

Et ouai c'est bien le bordel!
En fait ce qui m'ennui c'est qu'on puisse placer des commentaire sur la même ligne que du code! Pas bien pratique tout ca!
 
Enfin pour coder ca va bien les com sur la même ligne.

Message cité 2 fois
Message édité par dwogsi le 04-11-2005 à 14:59:40

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 04-11-2005 à 15:21:57    

dwogsi a écrit :

En même temps faut penser au http, ftp, https, etc...
(...)
des commentaire sur la même ligne que du code


tu as peut-être un bout de solution là !?!
genre pour éviter que http://truc.com et que ('#(//.*?\n)#i') soit matcher
il faudrait p.e. juste préciser qu'avant un // il ne pourrait y avoir que soit rien, soit un espace, soit un un point-virgule éventuellement, non ? Et théoriquement avec ça tu règles le bug de HFR que tu expériences dans ton 1er post ...


---------------
Il faut toujours arrondir les angles -- Raymond Poincaré (à moins que ce soit de Cicéron)
Reply

Marsh Posté le 04-11-2005 à 15:25:15    

Si tu cherches toutes les lignes commençant par // suffit de mettre dans la regex

Code :
  1. #^(//.*?\n)#


Attention néanmoins si tu indentes tes commentaires tu peux avoir des espaces ou des tabs avant donc je conseillerais:

Code :
  1. #^[\s|\t]*(//.*?\n)#


 
[edit]correction

Message cité 1 fois
Message édité par anapajari le 04-11-2005 à 15:25:40
Reply

Marsh Posté le 04-11-2005 à 15:25:50    

Bon alors je vais tenter un peite liste de tout ce qu'on peut trouver avant un commentaire :
) } { \n ; [:blank:]
 
Vous en voyez d'autres?
 
[edit]
Anapajari > Je viens de voir ton post, normalement [:blank:] règle  tab espace & co.


Message édité par dwogsi le 04-11-2005 à 15:30:09

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 04-11-2005 à 15:33:26    

dwogsi a écrit :

...
En fait ce qui m'ennui c'est qu'on puisse placer des commentaire sur la même ligne que du code! Pas bien pratique tout ca!
...


 
J'avais pas lu ça  ... Donc je ne t'ai fait une réponse que pour les lignes débutant par un commentaire ( d'ou le ^ au debut de la regex).
 
Donc vu ce que tu racontes tu risques effectivement d'être obligé de faire

Code :
  1. #[^\)|\}|\{|;|\s|\t](//.*?\n)#i


Reply

Marsh Posté le 04-11-2005 à 15:33:32    

anapajari a écrit :

Code :
  1. #^(//.*?\n)#



Moi avec ton code, ca match plus rien du tout...
 
[edit]
Je viens encore une fois de poster sans avoir vu ton post, donc on est d'accord.


Message édité par dwogsi le 04-11-2005 à 15:34:48

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 04-11-2005 à 15:33:32   

Reply

Marsh Posté le 04-11-2005 à 15:35:21    

T'as vu mon edit, dwogsi, pour un début de solution en approchant le problème différemment ?

Reply

Marsh Posté le 04-11-2005 à 15:37:04    

(non j'avais pas vu dsl)
En gros tu veux dire que ca match s'il n'y a pas de guillemet dans le commentaire?


Message édité par dwogsi le 04-11-2005 à 15:37:44

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 04-11-2005 à 15:38:11    

Voilà. C'est loin d'être parfait, mais ça résoud une partie des cas déjà.

Reply

Marsh Posté le 04-11-2005 à 15:44:09    

Effectivement, c'est un début de solution, mais bon si quelqu'un veut mettre un commentaire de ce genre :
// voila une sorte de "module"
 
Ca foire... Un commentaire comme ca peut très bien arriver.
 
Mais toutes vos solutions m'aide à avancer vers quelques chose, en tout cas on avance merci a vous tous.


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 04-11-2005 à 15:49:11    

dwogsi a écrit :

Ca foire... Un commentaire comme ca peut très bien arriver.


 
Tout à fait. C'est pour ça que j'ai dit que ça ne résolvait qu'une (bonne) partie des cas possibles. [:spamafote]
 
Après l'idéal serait de s'assurer que le nombre de guillemets précédent le pattern soit pair.
Mais là encore, on s'expose à ce genre de joyeuseté :

printf("Un machin, un guillemet : \", et un truc" ); // Ahah, nicked le commentaire

Reply

Marsh Posté le 04-11-2005 à 15:50:50    

Si si on peut éviter ca : \"
Avec une "look behind machin truc", j'avais vu ca mais me souviens plus du nom exacte........


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 04-11-2005 à 15:52:02    

Pattern de rétrovision ?
 
C'est une syntaxe du genre (?< ...), me souviens plus.

Reply

Marsh Posté le 04-11-2005 à 15:54:04    

Bah moi non plus me souviens plus... En fait ce qui est chiant avec mon problème c'est qu'il y a pas mal de cas à prevoir. Mais ca doit bien pouvoir se faire!


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 04-11-2005 à 16:26:20    

Ceci a l'air de marcher :
 

Code :
  1. $str = '$img = ImageCreateFromGif("http://fr.php.net/images/php.gif" ); // Commentaire sur la même ligne
  2. $img = ImageCreateFromGif("http://fr.php.net/images/php.gif" ); // Commentaire sur la même ligne';
  3. $temp = preg_split('#(\".*?\"|\'.*?\')#', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
  4. $str = '';
  5. for ($i = 0; $i < count($temp); $i++) {
  6. if ($i % 2 == 0) {
  7.  $str .= preg_replace('#(//.*)[\r\n]?#', '<span style="color:blue;">\\1</span><br />', $temp[$i]);
  8. } else {
  9.  $str .= $temp[$i];
  10. }
  11. }
  12. echo $str;


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-11-2005 à 16:34:49    

wow, j'ai pas tout compris mais je vais tester.
Si ca marche j'essayerai de comprendre.


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 04-11-2005 à 16:49:58    

Hummm... Désolé mais ca ne marche qu'à moitier.
le //fr.php/... ressort encore en bleu. Par contre les autres com sont bien tous en bleu.


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 04-11-2005 à 16:50:50    

Ca marche en local.
 
T'as recopié mon code ? Si non, fait voir ce que t'as.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-11-2005 à 16:54:54    

Bah j'y ais qu'en local, et je suis au boulo... Port 21 bloqué et j'ai pas encore installé de proxy chez moi. Donc tout ce que je peux vous proposer c'est un screenshot.
 
Mais sinon j'ais copier/coller ton code dans ma fonction, ensuite je l'ai essayé seul mais ya rien à faire ca veut pas.


Message édité par dwogsi le 04-11-2005 à 16:55:06

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 04-11-2005 à 16:56:57    

print_r($temp) t'affiche quoi.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-11-2005 à 17:02:19    

il me met :
 
Array ( [0] => $img = ImageCreateFromGif( [1] => "http://fr.php.net/images/php.gif" [2] => ); ) Array ( [0] => $img = ImageCreateFromGif( [1] => "http://fr.php.net/images/php.gif" [2] => ); ) Array ( [0] => $img = ImageCreateFromGif( [1] => "http://fr.php.net/images/php.gif" [2] => ); )


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 04-11-2005 à 17:04:18    

Les mecs, j'ai pas spécialement envie de vous emmerder mais

function test(
    $ceci,// Machin
    $est,// Bidule
    $un// Chose
    ,$test// balalaïka
) {
    print "Et hop ".$test;
}


C'est parfaitement valide en PHP
 
Donc il y a un peu plus de 3 ou 4 chars qui peuvent précéder un commentaire :o

Message cité 1 fois
Message édité par masklinn le 04-11-2005 à 17:05:01

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

Marsh Posté le 04-11-2005 à 17:06:37    

T'as fait trois print_r là ou... [:autobot]  
 
Ou alors t'as mis ça dans une boucle pour chaque ligne ? (ce qui est pas nécessaire)
 
Enfin bref, ça devrait marcher comme ça, vu qu'il fait le preg_replace que si le modulo 2 renvoie 0, donc pas sur les cases du tableau d'indice 1.
 
Donc j'vois pas pourquoi ça déconne.
 
T'as vraiment recopié ce que j'ai mis là ? [:figti]


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-11-2005 à 17:07:39    

masklinn a écrit :

Les mecs, j'ai pas spécialement envie de vous emmerder mais

function test(
    $ceci,// Machin
    $est,// Bidule
    $un// Chose
    ,$test// balalaïka
) {
    print "Et hop ".$test;
}


C'est parfaitement valide en PHP
 
Donc il y a un peu plus de 3 ou 4 chars qui peuvent précéder un commentaire :o


 
Spour ça que j'ai tenté de faire un truc qui ignore les chaînes de caractères, maintenant faut voir si ça marche pas que chez moi. [:mlc]


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-11-2005 à 17:24:43    

il fonctionne nickel ici, ton script, sielfried.
BTW, t'aurais pas un genre de bot qui écume HFR à la recherche des mots-clés (regex, preg) ?  :D


---------------
Il faut toujours arrondir les angles -- Raymond Poincaré (à moins que ce soit de Cicéron)
Reply

Marsh Posté le 04-11-2005 à 17:30:04    

Toutafé, d'ailleurs mon bot utilise lui-même preg_match pour scanner HFR. :o


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 05-11-2005 à 02:37:46    

sielfried a écrit :

T'as fait trois print_r là ou... [:autobot]  
 
Ou alors t'as mis ça dans une boucle pour chaque ligne ? (ce qui est pas nécessaire)
 
Enfin bref, ça devrait marcher comme ça, vu qu'il fait le preg_replace que si le modulo 2 renvoie 0, donc pas sur les cases du tableau d'indice 1.
 
Donc j'vois pas pourquoi ça déconne.
 
T'as vraiment recopié ce que j'ai mis là ? [:figti]


 
Bon demain je refais des test et je te dis ce que ca donne, parce que après relecture c'est vrai que le print_r() donne des choses étranges...


Message édité par dwogsi le 05-11-2005 à 02:38:06

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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