zpět k lekci

Najděte dvojice BB-značek

„BB-značka“ vypadá jako [značka]...[/značka], kde značka je jedna z následujících: b, url nebo quote.

Například:

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

BB-značky lze vnořit do sebe. Značka však nemůže být vnořena do stejné značky, například:

Běžné:
[url] [b]http://google.com[/b] [/url]
[quote] [b]text[/b] [/quote]

Nemůže se stát:
[b][b]text[/b][/b]

Značky mohou obsahovat konce řádků, to se běžně stává:

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

Vytvořte regulární výraz, který najde všechny BB-značky i s jejich obsahem.

Například:

let rv = /váš RV/příznaky;

let řetězec = "..[url]http://google.com[/url]..";
alert( řetězec.match(rv) ); // [url]http://google.com[/url]

Pokud jsou značky vnořené, potřebujeme vnější značku (pokud chceme, můžeme pokračovat v hledání v jejím obsahu):

let rv = /váš RV/příznaky;

let řetězec = "..[url][b]http://google.com[/b][/url]..";
alert( řetězec.match(rv) ); // [url][b]http://google.com[/b][/url]

Otevírací značka je \[(b|url|quote)].

Abychom pak našli vše až do uzavírací značky, použijeme vzor .*? s příznakem s, aby našel každý znak včetně nového řádku, a pak přidáme zpětný odkaz na uzavírací značku.

Celý vzor: \[(b|url|quote)\].*?\[/\1].

V akci:

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

let řetězec = `
  [b]ahoj![/b]
  [quote]
    [url]http://google.com[/url]
  [/quote]
`;

alert( řetězec.match(rv) ); // [b]ahoj![/b],[quote][url]http://google.com[/url][/quote]

Prosíme všimněte si, že jsme museli uvést únikový znak nejen před [, ale i před lomítkem uzavírací značky [\/\1], protože lomítko normálně uzavírá vzor.