potaka / bbcode
php parser for bb code
Installs: 1 393
Dependents: 1
Suggesters: 0
Security: 0
Stars: 4
Watchers: 1
Forks: 0
Open Issues: 0
Requires
- php: >=7.0
- tekstove/url-video-parser: ^1.0.1
Requires (Dev)
- phpunit/phpunit: 5.6.*
README
Builds:
There are two parts - tokenizer and parser.
Tokenization - convert string to tokens.
BbCodeParser - convert bbCodeTokens to html (+ some validations)
The Easy Way
$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>
Installation
composer require potaka/bbcode
Internal explanation
Tokenization
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
Tokenized to html
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
.