[ 'pattern' => '/\[h1\](.*?)\[\/h1\]/s', 'replace' => '

$1

', 'content' => '$1' ], 'h2' => [ 'pattern' => '/\[h2\](.*?)\[\/h2\]/s', 'replace' => '

$1

', 'content' => '$1' ], 'h3' => [ 'pattern' => '/\[h3\](.*?)\[\/h3\]/s', 'replace' => '

$1

', 'content' => '$1' ], 'h4' => [ 'pattern' => '/\[h4\](.*?)\[\/h4\]/s', 'replace' => '

$1

', 'content' => '$1' ], 'h5' => [ 'pattern' => '/\[h5\](.*?)\[\/h5\]/s', 'replace' => '
$1
', 'content' => '$1' ], 'h6' => [ 'pattern' => '/\[h6\](.*?)\[\/h6\]/s', 'replace' => '
$1
', 'content' => '$1' ], 'bold' => [ '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' ], 'strikethrough' => [ 'pattern' => '/\[s\](.*?)\[\/s\]/s', 'replace' => '$1', 'content' => '$1' ], 'quote' => [ 'pattern' => '/\[quote\](.*?)\[\/quote\]/s', 'replace' => '
$1
', 'content' => '$1' ], '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' ], 'sub' => [ 'pattern' => '/\[sub\](.*?)\[\/sub\]/s', 'replace' => '$1', 'content' => '$1' ], 'sup' => [ 'pattern' => '/\[sup\](.*?)\[\/sup\]/s', 'replace' => '$1', 'content' => '$1' ], 'small' => [ 'pattern' => '/\[small\](.*?)\[\/small\]/s', 'replace' => '$1', 'content' => '$1' ], 'table' => [ 'pattern' => '/\[table\](.*?)\[\/table\]/s', 'replace' => '$1
    ', 'content' => '$1', ], 'table-row' => [ 'pattern' => '/\[tr\](.*?)\[\/tr\]/s', 'replace' => '$1', 'content' => '$1', ], 'table-data' => [ 'pattern' => '/\[td\](.*?)\[\/td\]/s', 'replace' => '$1', 'content' => '$1', ], ]; private function searchAndReplace(string $pattern, string $replace, string $source): string { while (preg_match($pattern, $source)) { $source = preg_replace($pattern, $replace, $source); } return $source; } public function stripTags(string $source): string { foreach ($this->parsers as $name => $parser) { $source = $this->searchAndReplace($parser['pattern'] . 'i', $parser['content'], $source); } return $source; } public function parse(string $source, $caseInsensitive = null): string { $caseInsensitive = $caseInsensitive === self::CASE_INSENSITIVE ? true : false; foreach ($this->parsers as $name => $parser) { $pattern = ($caseInsensitive) ? $parser['pattern'] . 'i' : $parser['pattern']; $source = $this->searchAndReplace($pattern, $parser['replace'], $source); } return $source; } }