Aide - Recherche - Membres - Calendrier
Version complète : Expressions régulière "sauf dans [<__> ou #__\n]&
Forum Développeur - Administration serveur, programmation et base de données > Programmation > PHP
ElMoustiko
Exercice de style mais aussi et surtout apprentissage et manipulation des expressions régulières, je m'attèle à un script de coloration syntaxique pour le Python. (c'est pas juste pour le fun, ça me servira par la suite ^^)

Donc, j'avance, j'ai déjà fait pas mal de choses, j'ai bien ciblé mes besoins je pense mais là je calle sur un motif.

Je recherche les chaines de caractères, donc du type "_____" ou '_____'
De ce côté, ça fonctionne, merci à qwix dans son exemple de coloration syntaxique des CSS
Donc, le motif est du type :
CODE


'#("[a-z0-9\s.-]+")#i'



Ca ça roule, et justement, ça marche trop bien biggrin.gif, ehh oui, j'ai des <span class="..."> par exemple, donc ça marche pour eux aussi, donc c'est pas bon.

L'idée, c'est donc de remplacer les "____" par <span class="string">"____"</span> mais par n'importe quel "_____" juste ceux qui ne sont pas contenus dans <____> (ni dans #___\n parceque on colorie pas les chaines dans les commentaires, mais ça ira si j'arrive à le faire pour <___>)

Donc, j'ai testé ceci :
(note, j'ai remplacé a-z0-9 par \w\d)

CODE


'#("[\w\d\s.-^[(<(.*)>)|(\#(.*)\n)]]+")#i'; // les "____" non contenu dans #____\n ou <___>


Mais sans succès :/
C'est assez barbare comme truc, limite illisible ^^
En fait, j'ai des soucis au niveau de la gestion de l'exclusion avec ^, j'ai du mal à voir où le mettre (c'est le type d'exemple qui manque dans le tuto de qwix ^^ mais bon, il est déjà extra alors n'allons pas pleurnicher dessus !)

A mon avis, c'est totalement farfelu comme motif ...
Si vous aviez une idée, ça m'arrangerai ! D'autant que j'aurai besoin de ce motif pour le reste ^^
qwix
Je ne sais pas si c'est la digestion ou pas mais j'ai du mal à comprendre ce que tu veux.
Tu peux pas faire un truc du genre:
1 ce que tu veux
2 ce que tu as fait et qui ne marche pas trop

smile.gif
ElMoustiko
Lol, je savais que j'allais être incompris biggrin.gif

Bon
1-a- ce que je veux :
je veux mettre les chaines de caractères de la forme " bla bla bla " ou ' bla bla bla ' en couleur (bah vui logique pour de la coloration syntaxique biggrin.gif) (à coup de <span class="string">" bla bla bla "</span>)
1-b- ce que je ne veux pas :
* je ne veux pas que les guillemets et autres choses contenus dans les balises HTML (ici les <span class="string">) soient pris en compte.
* je ne veux pas non plus que les chaines qui sont dans un commentaire soient prise en compte, un commentaire en python, c'est # bla bla jusqu'à la fin de ligne, c'est à dire \n

Donc au final, je veux trouver les couples " bla bla bla " (ou avec ' bla bla bla ', mais là c'est pareil, juste à changer le " en ') et les mettres en couleur, mais je veux exclure de ma recherche de ces couples tout ce qui se trouve entre < et > (c'est à dire dans une balise HTML). La question des > et < du langage est réglée à coup de htmlspecialchars.

2- ce que j'ai fait :
CODE


$string = '#("[\w\d\s.-^[(<(.*)>)|(\#(.*)\n)]]+")#i'; // les "____" non contenu dans #____\n ou <___>

$code = preg_replace($string, "<span class=\"string\">$1</span>", $code);




wala !
Pas sûr que ça soit beaucoup plus clair :/
ElMoustiko
Ahh oui, j'oubliais, ce qui marche :

CODE


$string = array('#("[\w\d\s.-]+")#i',"#('[\w\d\s.-]+')#i");

$code = preg_replace($string, "<span class=\"string\">$1</span>", $code);



Ca, ça fonctionne impec mais bien sûr les " contenus dans les <span> sont interprétés.
Thanh
Tiens Olivier, je sais qu'on est fait pareil, qu'on aime bien réinventer la roue mais voici un truc qui m'a calmé question coloration syntaxique :

http://qbnz.com/highlighter/index.php

:wink:
ElMoustiko
Wé solo, je connais wink.gif
Mais j'y capte rien à tout ce fatra...
Y a même pas de regex :shock: dans leur bidul !!

En fait j'arrive même pas à l'utiliser, en plus c'est une usine à gaz par rapport à ce que je veux faire biggrin.gif
ElMoustiko
Woupss, petit oubli :

Au delà de ça, je souhaite vraiment apprendre à manier les expressions régulières, nul doute que ça me servira par la suite, notament au niveau d'un petit moteur de recherche par exemple. Enfin, c'est quelque chose que je voudrais apprendre et la coloration n'est qu'un "prétexte" wink.gif même si j'en ai besoin pour faire un truc ^^
Thanh
QUOTE
Wé solo, je connais wink.gif
Mais j'y capte rien à tout ce fatra...
Y a même pas de regex  :shock: dans leur bidul !!

En fait j'arrive même pas à l'utiliser, en plus c'est une usine à gaz par rapport à ce que je veux faire biggrin.gif


il faut trois lignes pour coloriser une script smile.gif
ElMoustiko
Revenons à nos moutons !
Je me rend compte que j'ai fait le boulet (ehh oui ^^ encore !), j'étais trop plongé dans ce que je me fixais comme but que j'ai pas vu qu'il y avait bien plus simple !!

S'occuper des "___" AVANT le reste, comme ça, j'ai pas de <span class=""> !!!

Donc, là ça marche, c'est cool, mais en fait, j'ai tout de même besoin de ce que je présente un peu plus haut pour la suite.
En fait, je dois isoler différente zone.

Donc, pour la suite, je ne dois plus m'occuper de tout ce qui est contenu à la suite d'un # sur la même ligne (donc jusqu'à \n), ni de ce qui est contenu dans "___" ou '___'

Donc, je vais plancher sur la suite, je trouverais peut être, le problème étant légèrement différent.

Je vous tiens au courant wink.gif
En tout cas les regexp, ça rox !

ps : Ahhh oui, je n'arrive pas à gérer les \" d'échapement dans un commentaire, bah vui, là le " doit pas être pris en compte, parcequ'au niveau du langage, "bla bla\"blabla" le \" n'est pas pris en compte comme fermeture de chaine !

J'ai testé un truc de ce style
CODE


'#"[\w\d\s.-^(\")]+")#i'


Mais c'est foireux, ça va pas :/
ElMoustiko
Boulayyy time again !!

En fait, mes zone #__\n et "___" ou '___' sont déjà isolée wink.gif
Ehh oui, c'est mes <span class="string"> et <span class="comment">, je devrais m'en tirer à ce niveau là donc.
Je retourne plancher là dessus biggrin.gif
ElMoustiko
Comment c'est bourrin GeSHi lol !!!

Le script il analyse le code source caractère par caractères, tu m'etonnes qu'il a pas besoin de regexps !!!

Ca vous parait pas moins efficace que d'utiliser des regexp ?
wox-xion
en tout cas les temps de parsage sont toujours courts... donc même si ça paraît bourrin, c'est efficace, surtout qu'on ne va pas poster des codes de 500 lignes avec ça, ce n'est pas le but...

franchement, merci pour le lien, mais c'est un projet de plus qu'en php, dommage... pourquoi pas de java ?! pourquoi pas de perl ?!
ElMoustiko
Je suis parti sur la coloration du HTML parceque c'est un peu plus simple pour aborder les expressions régulières. J'ai à peu près bouclé la chose, quelques détails et ensuite ça sera phase de test, mais j'ai un soucis au niveau des commentaires :/
Ca fonctionne pas sur plusieurs lignes...

mon code :
CODE


$comment = '#((&lt;!--)(.*)(--&gt;))#mi';

$code = preg_replace($comment, "<span class=\"comment\">$1</span>", $code);



Rien ne se passe, le \n ne semble pas pris en compte dans le (.*) :/
Ca fonctionne pour un commentaire sur une ligne seule.
J'ai pourtant mis "m" dans les options de l'expression régulières...
ElMoustiko
En fait, y a eu confusion, c'est #s et non #m qu'il faut utiliser.

Donc, là ça roule, mais ça merdouille à un endroit, je regarderais plus en détail.
Antoine
C'est où que ça merdouille ?
ElMoustiko
Woupss, pardon, j'ai oublié de revenir dire que ça fonctionné :/

Il me reste à gérer les attributs maintenant, mais j'ai un peu de mal à voir la stratégie à adopter.

Je vais déjà m'occuper des bla="..." ça devrait être assez simple, mais là où j'ai du mal à voir comment faire, c'est de ne pas prendre en compte ces éventuels motifs qui ne seraient pas contenus entre 2 < >

Voilà où j'en suis biggrin.gif

Sinon, le reste semble fonctionner :
http://elmoustikoblog.net/coloration_synta...xique/color.php

Donc, il ne reste a priori plus qu'à gérer les attributs et je devrais en avoir terminé. Si vous avez un conseil de la méthode à adopter, je suis partant tongue.gif

(Colo CSS de qwix, colo PHP, c'est juste du copié/collé d'une source HTML biggrin.gif)
Antoine
Ahlalala, on est tous les mêmes... on veut tous réécrire nos outils... perso, j'en ai un multi-langage...

8-) http://www.ac-graphic.net/Blog-22-colorati...tilanguage.php5
ElMoustiko
Euuuhhh


GRrrr :x

biggrin.gif
ElMoustiko
Voilà ce que ça donne :
http://elmoustikoblog.net/coloration_synta...xique/color.php

Je récupère les chaines du style bla="bli"

Donc celle contenue dans le <p> </p> :
<p> chaine style attribut="valeur" </p>

Bah c'est pris en compte, forcément :/

Comment peut on se limiter à ces même chaines mais contenues dans une balise, donc encadrer par <.... ...> ?

En même temps faudra que j'annule ces même chaines dans <? ... .... ?> pour le prologues et autres XML-eries
Antoine
c'est pas faisable en une requête par hasard ?

Perso, je me base sur une liste de mots-clé, les balises qui n'existe pas ne sont donc pas colorées. Idem pour les attributs... le pied smile.gif
ElMoustiko
Wé mais bon, j'ai pas envie de me faire un wordfile de XXX balises et attributs, c'est pas bien important biggrin.gif

Même si j'ai déjà ces wordfiles sous la main avec un editeur texte quelconque, j'ai pas envie de le faire biggrin.gif

Mais ça répond pas à ma question :x laugh.gif

Nan sérieux, vous avez pas une idée du motif à appliquer ??
Antoine
ben un truc du genre non ?

CODE
<([a-z])\s(([a-zA-Z0-9])\=(\"(.*?)\"))*? >
ElMoustiko
Ca ne fonctionne pas :/, j'avais déjà testé des trucs dans ce style ...

En fait, un truc qui serait cool, c'est de récupérer toutes les balises et uniquement les balises et d'appliquer le motif sur cette récupération. Mais je sais pas si c'est faisable ...
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2009 Invision Power Services, Inc.