Builds:
There are two parts - tokenizer and parser.
Tokenization - convert string to tokens.
BbCodeParser - convert bbCodeTokens to html (+ some validations)
$tokenizer = new \Potaka\BbCode\Tokenizer\Tokenizer();
$bbText = '[b]bold[/b]text[u]under[i]line[/i][/u]';
$tokenized = $tokenizer->tokenize($text);
$factory = new \Potaka\BbCode\Factory();
$bbcode = $factory->getFullBbCode();
$html = $bbcode->format($tokenized);
The value if html
is
<b>bold</b>text<u>under<i>line</i></u>
composer require potaka/bbcode
For example
$bbText = '[b]bold[/b]text[u]under[i]line[/i][/u]';
Will be tokenized to
Tag:
type: null,
tags:
tag1:
type: b
tags:
tag1:
type: null
text: bold
tag2:
type: null
text: text
tag3:
type: u
tags:
tag1:
type: null,
text: under
tag2:
type: i
tags:
tag1:
type: null,
text: line
You need to have valid bb code tags
. Build in tags are available in https://github.com/angelk/bbCode/tree/master/src/Potaka/BbCode/Tag
Building the parser:
use Potaka\BbCode;
use Potaka\BbCode\Tokenizer;
use Potaka\BbCode\Tag\Bold;
use Potaka\BbCode\Tag\Underline;
use Potaka\BbCode\Tag\Italic;
use Potaka\BbCode\Tag\Link;
$bbcode = new BbCode();
Lets add the b
code
$bold = new Bold();
$bbcode->addTag($bold);
Lets format the token from above
$tokenizer = new Tokenizer();
$tokenized = $tokenizer->tokenize($bbText);
$bbcode->format($tokenized);
will return
<b>bold</b>text[u]under[i]line[/i][/u]
u
and i
are not formated cuz tags are not added.
Lets add em.
$underline = new Underline();
$bbcode->addTag($underline);
$italic = new Italic();
$bbcode->addTag($italic);
Test again
$bbcode->format($tokenized);
Result:
<b>bold</b>text<u>under[i]line[/i]</u>
Why i
is not converted? Cuz u
doesn't allow child tag of type i
. Lets fix this
$bbcode->addAllowedChildTag($underline, $italic);
Everything should work now!
Whats the purpose of this allowing? Imagine you have link [url]http://google.bg[/url]
.
What if someone try to put link in link [url=http://google.bg]google.[url=http://gmail.com]bg[/url][/url]
?
This will generate
<a href="http://google.bg">
google.<a href="http://gmail.com">bg</a>
</a>
This html is invalid. It could even provide xss. This is why you should not allow url
inside url
.