Discussion:
Regex pour détecter les balises
(trop ancien pour répondre)
Julien Arlandis
2013-11-03 07:33:22 UTC
Permalink
Bonjour,

Pour Nemo j'ai besoin d'un regex capable de repérer tout contenu entre deux
balises bbcodes quelconques.

Par exemple, je cherche à isoler [X] Y [/X], avec X qui n'est pas connu à
l'avance.

Quelqu'un a une idée comment faire ?

J'ai écrit ceci :

var reg = /(\[tex\])([\s\S]*?)(\[\/tex\])/ig;
txt = txt.replace(reg, function(s, m){ reg = new RegExp(chevron+" ", "g");
return s.replace(reg,'');});

qui ne fonctionne que pour les balises [tex], comment généraliser ?

Merci.
Olivier Miakinen
2013-11-03 09:48:24 UTC
Permalink
Bonjour,
Post by Julien Arlandis
Pour Nemo j'ai besoin d'un regex capable de repérer tout contenu entre deux
balises bbcodes quelconques.
Note qu'il existe un groupe de discussion spécialement consacré aux
expressions rationnelles : fr.comp.lang.regexp. J'y fais suivre la
discussion.
Post by Julien Arlandis
Par exemple, je cherche à isoler [X] Y [/X], avec X qui n'est pas connu à
l'avance.
Quelqu'un a une idée comment faire ?
/(\[tex\])([\s\S]*?)(\[\/tex\])/ig;
qui ne fonctionne que pour les balises [tex], comment généraliser ?
En utilisant une référence arrière.

Je n'ai pas l'impression que les parenthèses que tu as mises te
servent, alors je les retire pour simplifier les explications, tu
pourras les rajouter après si tu en as besoin :

/\[tex\][\s\S]*?\[\/tex\]/ig

Maintenant rajoutons les parenthèses dont on a besoin pour la
référence arrière, celles autour du premier « tex » :

/\[(tex)\][\s\S]*?\[\/tex\]/ig

Ceci étant fait, on peut remplacer le second « tex » par « \1 »
qui est le contenu de la première paire de parenthèses rencontrée
dans la regexp :

/\[(tex)\][\s\S]*?\[\/\1\]/ig

Et maintenant tu peux remplacer le premier « tex » par une regexp
variable, ce qui devrait donner ce que tu veux. Exemple avec « tex »,
« b », « i » et « url » :

/\[(tex|b|i|url)\][\s\S]*?\[\/\1\]/ig

Bien sûr, tu peux même accepter une séquence quelconque de lettres,
par exemple :

/\[([a-z]+)\][\s\S]*?\[\/\1\]/ig


Note : à priori, je crois que ton flag /i global fera que la casse
peut être différente entre la balise ouvrante et la balise fermante,
par exemple [tEx] et [/Tex], mais cela reste à vérifier.

Note 2 : si tu veux rajouter tes parenthèses du début, alors il
faudra penser à renuméroter les références. Ici, en l'occurrence,
\1 deviendra \2 :

/(\[([a-z]+)\])([\s\S]*?)(\[\/\2\])/ig

Note 3 : je n'ai rien testé, par manque de temps. Aussi j'ai pu
laisser une coquille. Reviens nous le dire si ça ne fonctionne
pas (et si tu ne t'en sors pas tout seul).


Cordialement,
--
Olivier Miakinen
Continuer la lecture sur narkive:
Loading...