[ 'pattern' => '/\[b\](.*?)\[\/b\]/s', 'replace' => '$1', 'content' => '$1' ], 'italic' => [ 'pattern' => '/\[i\](.*?)\[\/i\]/s', 'replace' => '$1', 'content' => '$1' ], 'underline' => [ 'pattern' => '/\[u\](.*?)\[\/u\]/s', 'replace' => '$1', 'content' => '$1' ], 'linethrough' => [ 'pattern' => '/\[s\](.*?)\[\/s\]/s', 'replace' => '$1', 'content' => '$1' ], 'size' => [ 'pattern' => '/\[size\=([1-7])\](.*?)\[\/size\]/s', 'replace' => '$2', 'content' => '$2' ], 'color' => [ 'pattern' => '/\[color\=(#[A-f0-9]{6}|#[A-f0-9]{3})\](.*?)\[\/color\]/s', 'replace' => '$2', 'content' => '$2' ], 'center' => [ 'pattern' => '/\[center\](.*?)\[\/center\]/s', 'replace' => '
$1
', 'content' => '$1' ], 'left' => [ 'pattern' => '/\[left\](.*?)\[\/left\]/s', 'replace' => '
$1
', 'content' => '$1' ], 'right' => [ 'pattern' => '/\[right\](.*?)\[\/right\]/s', 'replace' => '
$1
', 'content' => '$1' ], 'quote' => [ 'pattern' => '/\[quote\](.*?)\[\/quote\]/s', 'replace' => '
$1
', 'content' => '$1' ], 'namedquote' => [ 'pattern' => '/\[quote\=(.*?)\](.*)\[\/quote\]/s', 'replace' => '
$1$2
', 'content' => '$2' ], 'link' => [ 'pattern' => '/\[url\](.*?)\[\/url\]/s', 'replace' => '$1', 'content' => '$1' ], 'namedlink' => [ 'pattern' => '/\[url\=(.*?)\](.*?)\[\/url\]/s', 'replace' => '$2', 'content' => '$2' ], 'image' => [ 'pattern' => '/\[img\](.*?)\[\/img\]/s', 'replace' => '', 'content' => '$1' ], 'orderedlistnumerical' => [ 'pattern' => '/\[list=1\](.*?)\[\/list\]/s', 'replace' => '
    $1
', 'content' => '$1' ], 'orderedlistalpha' => [ 'pattern' => '/\[list=a\](.*?)\[\/list\]/s', 'replace' => '
    $1
', 'content' => '$1' ], 'unorderedlist' => [ 'pattern' => '/\[list\](.*?)\[\/list\]/s', 'replace' => '', 'content' => '$1' ], 'listitem' => [ 'pattern' => '/\[\*\](.*)/', 'replace' => '
  • $1
  • ', 'content' => '$1' ], 'code' => [ 'pattern' => '/\[code\](.*?)\[\/code\]/s', 'replace' => '$1', 'content' => '$1' ], 'youtube' => [ 'pattern' => '/\[youtube\](.*?)\[\/youtube\]/s', 'replace' => '', 'content' => '$1' ], 'linebreak' => [ 'pattern' => '/\r\n/', 'replace' => '
    ', 'content' => '' ] ]; /** * @var array[] Our enabled parsers available with getParsers() */ private $enabledParsers; public function __construct() { $this->enabledParsers = $this->parsers; } /** * Parses the BBCode string * @param string $source String containing the BBCode * @param bool $caseInsensitive * @return string Parsed string */ public function parse($source, $caseInsensitive = false) { foreach ($this->enabledParsers as $name => $parser) { $pattern = ($caseInsensitive) ? $parser['pattern'] . 'i' : $parser['pattern']; $source = $this->searchAndReplace($pattern, $parser['replace'], $source); } return $source; } /** * Remove all BBCode * @param string $source * @return string Parsed text */ public function stripBBCodeTags($source) { foreach ($this->parsers as $name => $parser) { $source = $this->searchAndReplace($parser['pattern'] . 'i', $parser['content'], $source); } return $source; } /** * Searches after a specified pattern and replaces it with provided structure * @param string $pattern Search pattern * @param string $replace Replacement structure * @param string $source Text to search in * @return string Parsed text */ protected function searchAndReplace($pattern, $replace, $source) { while (preg_match($pattern, $source)) { $source = preg_replace($pattern, $replace, $source); } return $source; } /** * Helper function to parse case sensitive * @param string $source String containing the BBCode * @return string Parsed text */ public function parseCaseSensitive($source) { return $this->parse($source, false); } /** * Helper function to parse case insensitive * @param string $source String containing the BBCode * @return string Parsed text */ public function parseCaseInsensitive($source) { return $this->parse($source, true); } /** * Limits the parsers to only those you specify * @param mixed $only parsers * @return object BBCodeParser object */ public function only($only = null) { $only = (is_array($only)) ? $only : func_get_args(); $this->enabledParsers = $this->arrayOnly($this->parsers, $only); return $this; } /** * Removes the parsers you want to exclude * @param mixed $except parsers * @return BBCodeParser */ public function except($except = null) { $except = (is_array($except)) ? $except : func_get_args(); $this->enabledParsers = $this->arrayExcept($this->parsers, $except); return $this; } /** * List of chosen parsers * @return array array of parsers */ public function getParsers() { return $this->enabledParsers; } /** * Sets the parser pattern and replace. * This can be used for new parsers or overwriting existing ones. * @param string $name Parser name * @param string $pattern Pattern * @param string $replace Replace pattern * @param string $content Parsed text pattern * @return void */ public function setParser($name, $pattern, $replace, $content) { $this->parsers[$name] = array( 'pattern' => $pattern, 'replace' => $replace, 'content' => $content ); $this->enabledParsers[$name] = array( 'pattern' => $pattern, 'replace' => $replace, 'content' => $content ); } }