retour au cours

Trouver les paires de bbtag

Un “bb-tag” ressemble à [tag]...[/tag], où tag peut être : b, url ou quote.

Par exemple :

[b]text[/b]
[url]http://google.com[/url]

Les BB-tags peuvent être imbriqués. Mais un tag ne peut pas être imbriqué dans lui même, par exemple :

Normal:
[url] [b]http://google.com[/b] [/url]
[quote] [b]text[/b] [/quote]

Ne peut pas arriver:
[b][b]text[/b][/b]

Les tags peuvent contenir des sauts de ligne, c’est normal :

[quote]
  [b]text[/b]
[/quote]

Créez une regexp pour trouver tous les BB-tags avec leur contenu.

Par exemple :

let regexp = /your regexp/flags;

let str = "..[url]http://google.com[/url]..";
alert( str.match(regexp) ); // [url]http://google.com[/url]

Si les tags sont imbriqués, alors nous voulons le tag extérieur (si nous voulons nous pouvons continuer la recherche dans le contenu) :

let regexp = /your regexp/flags;

let str = "..[url][b]http://google.com[/b][/url]..";
alert( str.match(regexp) ); // [url][b]http://google.com[/b][/url]

Un tag d’ouverture est \[(b|url|quote)\].

Ensuite pour trouver tout jusqu’au tag de fermeture, utilisons le modèle .*? avec le flag s pour trouver n’importe quel caractère en plus des sauts de ligne, puis ajoutons une référence au tag de fermeture.

Le modèle complet : \[(b|url|quote)\].*?\[/\1].

En action :

let regexp = /\[(b|url|quote)].*?\[\/\1]/gs;

let str = `
  [b]hello![/b]
  [quote]
    [url]http://google.com[/url]
  [/quote]
`;

alert( str.match(regexp) ); // [b]hello![/b],[quote][url]http://google.com[/url][/quote]

Veuillez noter qu’en plus d’échapper [, nous avons dû échapper une barre oblique pour la balise de fermeture [\/\1], car normalement la barre oblique ferme le modèle.