Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Regex pour détecter les balises

1 réponse
Avatar
Julien Arlandis
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.

1 réponse

Avatar
Olivier Miakinen
Bonjour,

Le 03/11/2013 08:33, Julien Arlandis a écrit :

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.

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 :

/([tex])([sS]*?)([/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][sS]*?[/tex]/ig

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

/[(tex)][sS]*?[/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)][sS]*?[/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)][sS]*?[/1]/ig

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

/[([a-z]+)][sS]*?[/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]+)])([sS]*?)([/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