J'utilise un produit Zope qui s'appelle CMFBoard.
Ce produit a un petit bug agacant. Je vous le décris.
Dans les BulletinBoard tels phpBB on peut ecrire des messages avec un
langage a balise simplifié. Pour phpBB ils ont appelé ca le BBcode.
C'est presque pareil au HTML mais avec des [tag="attribut"] ... [/tag].
Il se trouve qua CMFborad a aussi son langage "BBcode" mais qui n'a pas de
nom. Son "parseur"/"transcodeur en HTML" est buggé:
Par exemple, si j'ai
"""
[url="http://toto"]urltoto[/url] du texte [url="http://titi"]urltiti[/url]
"""
Alors il devrait me donner un truc comme:
<a href="http://toto">urltoto</a> du texte
<a href="http://titi">urltiti</a> .
Malheureusement, il donne ceci :
<a href"http://toto"]urltoto[/url] du texte [url="http://titi">urltiti</a>
Je l'explique tres bien ici :
http://www.cmfboard.org/forums/cmfboard/bugs/0164897765943
J'ai jetté un oeil au code source.
Je pense que probleme est du a la regexp qui est mal faite: Elle est en
mode "gourmand" (glouton).
C'est a dire qu'elle regarde le premier " , puis ensuite elle cherche le
" correspondant, mais le " correspondant est, pour elle, le dernier. Cela
de part le fait qu'il est "glouton".
Si vous avez remarqué ma derniere intervention ici c'etait au sujet des
regexp et du module 're', et justement depuis ce temps je n'arrive pas a
decoder cette chose.
Comment s'y prendre pour decomposer cette regexp ultra compliquée en
petits morceaux plus compréhensibles? Faut que je rectifie ce bug
parcequ'on aura besoin de ce CMFBoard mais sans ce bug dans quelques temps.
Merci d'avance.
--
ASPO Infogérance - http://aspo.rktmb.org/activites/infogerance
Unofficial FAQ fcolc - http://faq.fcolc.eu.org/
Linux User Group sur Orléans et alentours.
Tél: + 33 2 38 76 43 65 (France)
Ben a priori non ! ex : "[^"]*" Ceci ne devrait matcher que un guillemet suivit de plusieurs caractères qui ne sont pas des guillemets et enfin un guillemet. Donc greedy ou pas, cela devrait matcher ce que tu veux... Sinon tu peux toujours essayer "[^"]*?"...
Ben a priori non !
ex : "[^"]*"
Ceci ne devrait matcher que un guillemet suivit de plusieurs caractères
qui ne sont pas des guillemets et enfin un guillemet. Donc greedy ou
pas, cela devrait matcher ce que tu veux... Sinon tu peux toujours
essayer "[^"]*?"...
Ben a priori non ! ex : "[^"]*" Ceci ne devrait matcher que un guillemet suivit de plusieurs caractères qui ne sont pas des guillemets et enfin un guillemet. Donc greedy ou pas, cela devrait matcher ce que tu veux... Sinon tu peux toujours essayer "[^"]*?"...
C'est moi qui ai loupé des choses. Si tu pouvais, par exemple m'aider a decomposer ces regexps en plus simples, ca serait cool. Je veux dire ... expliquer morceau par morceau, et aussi me dire pourquoi il l'a fait en trois lignes.
Je mets ici le fichier de code entier: http://faq.fcolc.eu.org/Members/mihamina/divers/forum_codes.py.html/download (Il est coloré syntaxiquement, facile a lire, mais pas facile pour moi :-))
-- ASPO Infogérance - http://aspo.rktmb.org/activites/infogerance Unofficial FAQ fcolc - http://faq.fcolc.eu.org/ Linux User Group sur Orléans et alentours. Tél: + 33 2 38 76 43 65 (France)
C'est moi qui ai loupé des choses.
Si tu pouvais, par exemple m'aider a decomposer ces regexps en plus
simples, ca serait cool.
Je veux dire ... expliquer morceau par morceau, et aussi me dire pourquoi
il l'a fait en trois lignes.
Je mets ici le fichier de code entier:
http://faq.fcolc.eu.org/Members/mihamina/divers/forum_codes.py.html/download
(Il est coloré syntaxiquement, facile a lire, mais pas facile pour moi :-))
--
ASPO Infogérance - http://aspo.rktmb.org/activites/infogerance
Unofficial FAQ fcolc - http://faq.fcolc.eu.org/
Linux User Group sur Orléans et alentours.
Tél: + 33 2 38 76 43 65 (France)
C'est moi qui ai loupé des choses. Si tu pouvais, par exemple m'aider a decomposer ces regexps en plus simples, ca serait cool. Je veux dire ... expliquer morceau par morceau, et aussi me dire pourquoi il l'a fait en trois lignes.
Je mets ici le fichier de code entier: http://faq.fcolc.eu.org/Members/mihamina/divers/forum_codes.py.html/download (Il est coloré syntaxiquement, facile a lire, mais pas facile pour moi :-))
-- ASPO Infogérance - http://aspo.rktmb.org/activites/infogerance Unofficial FAQ fcolc - http://faq.fcolc.eu.org/ Linux User Group sur Orléans et alentours. Tél: + 33 2 38 76 43 65 (France)
Yermat
Rakotomandimby (R12y) Mihamina wrote:
( Tue, 14 Dec 2004 17:10:09 +0100 ) Yermat : [...] C'est moi qui ai loupé des choses. Si tu pouvais, par exemple m'aider a decomposer ces regexps en plus simples, ca serait cool. Je veux dire ... expliquer morceau par morceau, et aussi me dire pourquoi il l'a fait en trois lignes.
Je mets ici le fichier de code entier: http://faq.fcolc.eu.org/Members/mihamina/divers/forum_codes.py.html/download (Il est coloré syntaxiquement, facile a lire, mais pas facile pour moi :-))
Déjà un petit tour dans la doc pourra t'aider :
Les trois lignes c'est, a priori, que pour la lisibilité. J'ai fait le test et en une ligne, c'est le même résultat ! Je ne savais pas que cela marchait...
Reprenons dans l'ordre : 1) r'[ trn]*([a-zA-Z_][-.a-zA-Z_0-9]*)' [ trn]* -> reconnais plusieurs espace, tabulation ou retour à la ligne. Pourquoi ne pas avoir choisit s* ? [a-zA-Z_] reconnais une lettre ou un souligné. [-.a-zA-Z_0-9]* suivit de plusieurs lettres, chiffres ou tiret ou point ou souligné.
en fait 1) reconnais la partie nom de l'element.
2) r'([ trn]*=[ trn]*' on reconnais maintenant presque n'importe quel blanc suivit d'un égal puis de (presques tous les) blancs.
commencons par la fin : le dernier point d'interrogation indique que cet élément est optionel. En fait c'est même le 2) et 3) qui le sont !
les différents | indique un choix donc a|b reconnait soit a soit b.
'[^']*' -> on reconnait un guillement simple suivit de tout sauf un guillement suivit d'un guillemet simple.
"[^"]*" -> on reconnait un guillement double suivit de tout sauf un guillement suivit d'un guillemet double.
"[^"]*" -> on reconnait un " suivit de tout sauf un guillement double suivit d'un ".
[-a-zA-Z0-9./:+*%?!()_#=~]* -> on reconnait plusieurs de ces caractères.
Pour finir, dés qu'il y a des parenthèses, on pourra récuperer le pattern plus tard.
Visiblement, cette regexp doit bien faire ce que on lui demande, analyser qu'un seul url="http://toto" et renvoyer (url, http://toto). Toujours a priori c'est avant qu'il faut revoir ce que l'on passe à cette regexp...
Je vais essayer de regarder un peu mais bon...
-- Yermat
Rakotomandimby (R12y) Mihamina wrote:
( Tue, 14 Dec 2004 17:10:09 +0100 ) Yermat :
[...]
C'est moi qui ai loupé des choses.
Si tu pouvais, par exemple m'aider a decomposer ces regexps en plus
simples, ca serait cool.
Je veux dire ... expliquer morceau par morceau, et aussi me dire pourquoi
il l'a fait en trois lignes.
Je mets ici le fichier de code entier:
http://faq.fcolc.eu.org/Members/mihamina/divers/forum_codes.py.html/download
(Il est coloré syntaxiquement, facile a lire, mais pas facile pour moi :-))
Déjà un petit tour dans la doc pourra t'aider :
Les trois lignes c'est, a priori, que pour la lisibilité. J'ai fait le
test et en une ligne, c'est le même résultat ! Je ne savais pas que cela
marchait...
Reprenons dans l'ordre :
1) r'[ trn]*([a-zA-Z_][-.a-zA-Z_0-9]*)'
[ trn]* -> reconnais plusieurs espace, tabulation ou retour à la
ligne. Pourquoi ne pas avoir choisit s* ?
[a-zA-Z_] reconnais une lettre ou un souligné.
[-.a-zA-Z_0-9]* suivit de plusieurs lettres, chiffres ou tiret ou point
ou souligné.
en fait 1) reconnais la partie nom de l'element.
2) r'([ trn]*=[ trn]*'
on reconnais maintenant presque n'importe quel blanc suivit d'un égal
puis de (presques tous les) blancs.
commencons par la fin : le dernier point d'interrogation indique que cet
élément est optionel. En fait c'est même le 2) et 3) qui le sont !
les différents | indique un choix donc a|b reconnait soit a soit b.
'[^']*' -> on reconnait un guillement simple suivit de tout sauf un
guillement suivit d'un guillemet simple.
"[^"]*" -> on reconnait un guillement double suivit de tout sauf un
guillement suivit d'un guillemet double.
"[^"]*" -> on reconnait un " suivit de tout sauf un
guillement double suivit d'un ".
[-a-zA-Z0-9./:+*%?!()_#=~]* -> on reconnait plusieurs de ces caractères.
Pour finir, dés qu'il y a des parenthèses, on pourra récuperer le
pattern plus tard.
Visiblement, cette regexp doit bien faire ce que on lui demande,
analyser qu'un seul url="http://toto" et renvoyer (url, http://toto).
Toujours a priori c'est avant qu'il faut revoir ce que l'on passe à
cette regexp...
( Tue, 14 Dec 2004 17:10:09 +0100 ) Yermat : [...] C'est moi qui ai loupé des choses. Si tu pouvais, par exemple m'aider a decomposer ces regexps en plus simples, ca serait cool. Je veux dire ... expliquer morceau par morceau, et aussi me dire pourquoi il l'a fait en trois lignes.
Je mets ici le fichier de code entier: http://faq.fcolc.eu.org/Members/mihamina/divers/forum_codes.py.html/download (Il est coloré syntaxiquement, facile a lire, mais pas facile pour moi :-))
Déjà un petit tour dans la doc pourra t'aider :
Les trois lignes c'est, a priori, que pour la lisibilité. J'ai fait le test et en une ligne, c'est le même résultat ! Je ne savais pas que cela marchait...
Reprenons dans l'ordre : 1) r'[ trn]*([a-zA-Z_][-.a-zA-Z_0-9]*)' [ trn]* -> reconnais plusieurs espace, tabulation ou retour à la ligne. Pourquoi ne pas avoir choisit s* ? [a-zA-Z_] reconnais une lettre ou un souligné. [-.a-zA-Z_0-9]* suivit de plusieurs lettres, chiffres ou tiret ou point ou souligné.
en fait 1) reconnais la partie nom de l'element.
2) r'([ trn]*=[ trn]*' on reconnais maintenant presque n'importe quel blanc suivit d'un égal puis de (presques tous les) blancs.
commencons par la fin : le dernier point d'interrogation indique que cet élément est optionel. En fait c'est même le 2) et 3) qui le sont !
les différents | indique un choix donc a|b reconnait soit a soit b.
'[^']*' -> on reconnait un guillement simple suivit de tout sauf un guillement suivit d'un guillemet simple.
"[^"]*" -> on reconnait un guillement double suivit de tout sauf un guillement suivit d'un guillemet double.
"[^"]*" -> on reconnait un " suivit de tout sauf un guillement double suivit d'un ".
[-a-zA-Z0-9./:+*%?!()_#=~]* -> on reconnait plusieurs de ces caractères.
Pour finir, dés qu'il y a des parenthèses, on pourra récuperer le pattern plus tard.
Visiblement, cette regexp doit bien faire ce que on lui demande, analyser qu'un seul url="http://toto" et renvoyer (url, http://toto). Toujours a priori c'est avant qu'il faut revoir ce que l'on passe à cette regexp...
Je vais essayer de regarder un peu mais bon...
-- Yermat
Tibi
On Tue, 14 Dec 2004 16:00:53 +0100, Rakotomandimby (R12y) Mihamina wrote:
Comment s'y prendre pour decomposer cette regexp ultra compliquée en petits morceaux plus compréhensibles? Faut que je rectifie ce bug
Un petit programme bien pratique quand on joue avec des regexps: http://kodos.sourceforge.net/
On Tue, 14 Dec 2004 16:00:53 +0100, Rakotomandimby (R12y) Mihamina
<mihamina@mail.rktmb.org> wrote:
Comment s'y prendre pour decomposer cette regexp ultra compliquée en
petits morceaux plus compréhensibles? Faut que je rectifie ce bug
Un petit programme bien pratique quand on joue avec des regexps:
http://kodos.sourceforge.net/