An open API service indexing awesome lists of open source software.

https://github.com/angelk/bbcode


https://github.com/angelk/bbcode

bbcode bbcodeparser parser php

Last synced: about 2 months ago
JSON representation

Awesome Lists containing this project

README

          

# 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`.