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.