A fork of potaka/bbcode to handle future maintenance
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Christopher Ross Hind 636800e850 Handle unencoded ampersands in tag attributes 3 years ago
src/Knockout/BbCode Handle unencoded ampersands in tag attributes 3 years ago
tests/phpUnit issues-17 (#18) 7 years ago
.gitignore initial commit 7 years ago
.travis.yml Update php versions in travis 3 years ago
LICENSE initial commit 7 years ago
README.md Readme update (#6) 7 years ago
composer.json Change namespace and removed external dependency 3 years ago

README.md

BB code parser for php 7.0+

Builds:

SensioLabsInsight

Build Status

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.