torna alle lezioni

Trovate le coppie di bbtag

Un “bb-tag” si presenta così [tag]...[/tag], in cui tag è uno tra: b, url o quote.

Ad esempio:

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

I BB-tags possono essere annidati. Un tag, tuttavia, non può essere contenuto all’interno di uno dello stesso tipo, ad esempio:

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

Non deve verificarsi:
[b][b]text[/b][/b]

I tag possono contenere interruzioni di linea, questo è del tutto normale:

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

Create una regexp per trovare tutti i BB-tags con il loro contenuto.

Per esempio:

let regexp = /your regexp/flags;

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

In caso di tag annidati ci occorre il tag esterno (se lo desideriamo possiamo continuare la ricerca nel contenuto appena ricavato):

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]

Il tag di apertura è \[(b|url|quote)\].

Successivamente per trovare tutto fino al tag di chiusura usiamo il pattern .*? con il flag s per cercare la corrispondenza con ogni carattere inclusa una nuova riga. Per concludere aggiungiamo un riferimento all’indietro per il tag di chiusura.

L’intero pattern risultante è: \[(b|url|quote)\].*?\[/\1\].

In azione:

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]

Si noti che oltre l’escape di [ e ], abbiamo dovuto fare l’escape dello slash del tag di chiusura [\/\1], poiché normalmente lo slash termina il pattern.