Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1359 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Coloration et regex, marche comme ca veux

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Coloration et regex, marche comme ca veux

n°1238690
dwogsi
Défaillance cérébrale...
Posté le 04-11-2005 à 14:39:37  profilanswer
 

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})/
mood
Publicité
Posté le 04-11-2005 à 14:39:37  profilanswer
 

n°1238695
Xav_
The only one...
Posté le 04-11-2005 à 14:45:50  profilanswer
 

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
n°1238701
dwogsi
Défaillance cérébrale...
Posté le 04-11-2005 à 14:50:25  profilanswer
 

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})/
n°1238714
Elmoricq
Modérateur
Posté le 04-11-2005 à 14:57:17  profilanswer
 

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
n°1238719
dwogsi
Défaillance cérébrale...
Posté le 04-11-2005 à 14:59:19  profilanswer
 

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})/
n°1238769
shakpana
des fois, j'me demande ...
Posté le 04-11-2005 à 15:21:57  profilanswer
 

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)
n°1238772
anapajari
s/travail/glanding on hfr/gs;
Posté le 04-11-2005 à 15:25:15  profilanswer
 

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
n°1238773
dwogsi
Défaillance cérébrale...
Posté le 04-11-2005 à 15:25:50  profilanswer
 

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})/
n°1238785
anapajari
s/travail/glanding on hfr/gs;
Posté le 04-11-2005 à 15:33:26  profilanswer
 

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


n°1238786
dwogsi
Défaillance cérébrale...
Posté le 04-11-2005 à 15:33:32  profilanswer
 

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})/
mood
Publicité
Posté le 04-11-2005 à 15:33:32  profilanswer
 

n°1238790
Elmoricq
Modérateur
Posté le 04-11-2005 à 15:35:21  profilanswer
 

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

n°1238793
dwogsi
Défaillance cérébrale...
Posté le 04-11-2005 à 15:37:04  profilanswer
 

(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})/
n°1238796
Elmoricq
Modérateur
Posté le 04-11-2005 à 15:38:11  profilanswer
 

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

n°1238807
dwogsi
Défaillance cérébrale...
Posté le 04-11-2005 à 15:44:09  profilanswer
 

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})/
n°1238819
Elmoricq
Modérateur
Posté le 04-11-2005 à 15:49:11  profilanswer
 

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

n°1238820
dwogsi
Défaillance cérébrale...
Posté le 04-11-2005 à 15:50:50  profilanswer
 

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})/
n°1238823
Elmoricq
Modérateur
Posté le 04-11-2005 à 15:52:02  profilanswer
 

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

n°1238826
dwogsi
Défaillance cérébrale...
Posté le 04-11-2005 à 15:54:04  profilanswer
 

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})/
n°1238868
sielfried
Posté le 04-11-2005 à 16:26:20  profilanswer
 

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
n°1238885
dwogsi
Défaillance cérébrale...
Posté le 04-11-2005 à 16:34:49  profilanswer
 

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})/
n°1238916
dwogsi
Défaillance cérébrale...
Posté le 04-11-2005 à 16:49:58  profilanswer
 

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})/
n°1238918
sielfried
Posté le 04-11-2005 à 16:50:50  profilanswer
 

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
n°1238929
dwogsi
Défaillance cérébrale...
Posté le 04-11-2005 à 16:54:54  profilanswer
 

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})/
n°1238934
sielfried
Posté le 04-11-2005 à 16:56:57  profilanswer
 

print_r($temp) t'affiche quoi.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
n°1238942
dwogsi
Défaillance cérébrale...
Posté le 04-11-2005 à 17:02:19  profilanswer
 

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})/
n°1238946
masklinn
í dag viðrar vel til loftárása
Posté le 04-11-2005 à 17:04:18  profilanswer
 

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
n°1238949
sielfried
Posté le 04-11-2005 à 17:06:37  profilanswer
 

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
n°1238950
sielfried
Posté le 04-11-2005 à 17:07:39  profilanswer
 

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
n°1238967
shakpana
des fois, j'me demande ...
Posté le 04-11-2005 à 17:24:43  profilanswer
 

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)
n°1238971
sielfried
Posté le 04-11-2005 à 17:30:04  profilanswer
 

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


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
n°1239210
dwogsi
Défaillance cérébrale...
Posté le 05-11-2005 à 02:37:46  profilanswer
 

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})/
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Coloration et regex, marche comme ca veux

 

Sujets relatifs
Marche sous Mozilla mais pas sous IEScript de vérification de numéro de téléphone qui marche pas
pourquoi ca ne marche pas :(ptit script marche sur IE pas sur Firefox
[nsis] DeleteRegKey ne marche pas....comment ca marche les div
S'il Vous plait une je veux une explication sur le type HDC sur Visuptite aide gawk pour afficher la ligne que je veux
[POSTGRESQL] Fct plpgsql - Nom de champ modifiable, marche pas. pq? :(changement de nom de domaine et mon script marche plus..
Plus de sujets relatifs à : Coloration et regex, marche comme ca veux


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR