# BB code parser for php 7.0+ Builds: [![SensioLabsInsight](https://insight.sensiolabs.com/projects/054684fa-c2d1-4cc3-8905-d4a797961c22/big.png)](https://insight.sensiolabs.com/projects/054684fa-c2d1-4cc3-8905-d4a797961c22) [![Build Status](https://travis-ci.org/angelk/bbCode.svg?branch=jenkins-integrati)](https://travis-ci.org/angelk/bbCode) There are two parts - tokenizer and parser. Tokenization - convert string to tokens. BbCodeParser - convert bbCodeTokens to html (+ some validations) # The Easy Way ```php $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 ```html boldtextunderline ``` # 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 ```yml 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: ```php 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 ``` boldtext[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: ```html boldtextunder[i]line[/i] ``` 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 ```html google.bg ``` This html is invalid. It could even provide [xss](https://en.wikipedia.org/wiki/Cross-site_scripting). This is why you should not allow `url` inside `url`.