Skip to content

Public methods

Visman edited this page Jan 26, 2024 · 18 revisions

addBBCode

Parserus addBBCode ( array $bb )

This method adds one bb-code to the parser. / Метод добавляет в парсер один bb-код.

$bb
The array describing a bb-code. / Массив с описанием bb-кода.

Example

$parser = new Parserus();

$parser->addBBCode([
    'tag' => 'code',
    'type' => 'block',
    'recursive' => true,
    'text_only' => true,
    'pre' => true,
    'attrs' => [
        'Def' => true,
        'No_attr' => true,
    ],
    'handler' => function($body, $attrs) {
        $body = trim($body, "\n");
        $class = substr_count($body, "\n") > 28 ? ' class="vscroll"' : '';
        return '<div class="codebox"><pre' . $class . '><code>' . $body . '</code></pre></div>';
    },
]);

setBBCodes

Parserus setBBCodes ( array $bbcodes )

This method sets an array of bb-codes. / Метод задает массив bb-кодов.

$bbcodes
Array of descriptions of bb-codes. / Массив описаний bb-кодов.

Example

$parser = new Parserus();

$parser->setBBCodes([
    ['tag' => 'b',
     'handler' => function($body) {
         return '<b>' . $body . '</b>';
     },
    ],
    ['tag' => 'i',
     'handler' => function($body) {
         return '<i>' . $body . '</i>';
     },
    ],
]);

setSmilies

Parserus setSmilies ( array $smilies )

This method sets an array of smilies. / Метод задает массив смайлов.

$smilies
Array of smilies. / Массив смайлов.

Example

$parser = new Parserus();

$parser->setSmilies([
    ':)' => 'http://example.com/smilies/smile.png',
    ';)' => 'http://example.com/smilies/wink.png',
]);

setSmTpl

Parserus setSmTpl ( string $tpl [, string $tag = 'img' [, array $bl = array('url') ]] )

This method sets a template for display of smilies. / Метод устанавливает шаблон для отображения смайлов.

$tpl
Template / Шаблон. (<img src="{url}" alt="{alt}">)

$tag
BB-code name. / Имя bb-кода.

$bl
Array with names of bb-codes in which smiles won't be displayed under any condition. / Массив с именами bb-кодов, в которых смайлы не будут отображаться ни при каком условии.

Example

$parser = new Parserus();

$parser->setSmilies([
    ':)' => 'http://example.com/smilies/smile.png',
    ';)' => 'http://example.com/smilies/wink.png',
])->setSmTpl('<img src="{url}" alt="{alt}">');

detectSmilies

Parserus detectSmilies ( )

This method activates (if there is an opportunity) display of smilies on the current tree of tags. / Метод включает (если есть возможность) отображение смайлов на текущем дереве тегов.

Example

$parser = new Parserus();

echo $parser->setSmilies([
    ':)' => 'http://example.com/smilies/smile.png',
    ';)' => 'http://example.com/smilies/wink.png',
])->addBBCode([
    'tag' => 'img',
    'type' => 'img',
    'parents' => ['inline', 'block', 'url'],
    'text_only' => true,
    'attrs' => [
        'Def' => [
            'body_format' => '%^(?:(?:ht|f)tps?://[^\x00-\x1f\s<"]+|data:image/[a-z]+;base64,(?:[a-zA-Z\d/\+\=]+))$%D'
        ],
        'No_attr' => [
            'body_format' => '%^(?:(?:ht|f)tps?://[^\x00-\x1f\s<"]+|data:image/[a-z]+;base64,(?:[a-zA-Z\d/\+\=]+))$%D'
        ],
    ],
    'handler' => function($body, $attrs, $parser) {
        if (! isset($attrs['Def'])) {
            $attrs['Def'] = (substr($body, 0, 11) === 'data:image/') ? 'base64' : basename($body);
        }
        return '<img src="' . $body . '" alt="' . $attrs['Def'] . '">';
    },
])->setSmTpl('<img src="{url}" alt="{alt}">')
  ->parse(":)\n;)")
  ->detectSmilies()
  ->getHTML();

#output: <img src="http://example.com/smilies/smile.png" alt=":)"><br><img src="http://example.com/smilies/wink.png" alt=";)">

setWhiteList

Parserus setWhiteList ( [ mixed $list = null ] )

This method sets the list of the allowed bb-codes. / Метод устанавливает список разрешенных bb-кодов.

$list
Array of names of bb-codes or null. / Массив наименований bb-кодов или null.
The value type different from an array switches off filtering. / Тип значения отличающийся от массива выключает фильтрацию.

Example

$parser = new Parserus();

$parser->setWhiteList(['b','i','u','s','color']);

setBlackList

Parserus setBlackList ( [ mixed $list = null ] )

This method sets the list of the forbidden bb-codes. / Метод устанавливает список запрещенных bb-кодов.

$list
Array of names of bb-codes or null. / Массив наименований bb-кодов или null.
Only not the empty array switches on filtering. / Только не пустой массив включает фильтрацию.

Example

$parser = new Parserus();

$parser->setBlackList(['url','img','email','list','*']);

setAttr

Parserus setAttr ( string $name, mixed $val )

This method sets variable value for possible use in bb-codes. / Метод задает значение переменной для возможного использования в bb-кодах.

$name
Variable name. / Имя переменной.

$val
Variable value. / Значение переменной.

Example

$parser = new Parserus();

$parser->setAttr('baseUrl', 'http://example.com/');

attr

mixed attr ( string $name )

Method for obtaining variable value. / Метод для получения значения переменной.

$name
Variable name. / Имя переменной.

Example

$parser = new Parserus();

echo $parser->addBBCode([
    'tag' => 'after',
    'type' => 'block',
    'single' => true,
    'attrs' => [
        'Def' => [
           'format' => '%^\d+$%',
        ],
    ],
    'handler' => function($body, $attrs, $parser) {
        $lang = $parser->attr('lang');
        $arr = array();
        $sec = $attrs['Def'] % 60;
        $min = ($attrs['Def'] / 60) % 60;
        $hours = ($attrs['Def'] / 3600) % 24;
        $days = (int) ($attrs['Def'] / 86400);
        if ($days > 0) {
            $arr[] = $days . $lang['After time d'];
        }
        if ($hours > 0) {
            $arr[] = $hours . $lang['After time H'];
        }
        if ($min > 0) {
            $arr[] = (($min < 10) ? '0' . $min : $min) . $lang['After time i'];
        }
        if ($sec > 0) {
            $arr[] = (($sec < 10) ? '0' . $sec : $sec) . $lang['After time s'];
        }

        $attr = $lang['After time'] . ' ' . implode(' ', $arr);

        return '<span style="color: #808080"><em>' . $attr . ':</em></span><br>';
     },
])->setAttr('lang', [
    'After time'   => 'Added later',
    'After time s' => ' s',
    'After time i' => ' min',
    'After time H' => ' h',
    'After time d' => ' d',
])->parse('[after=10123]')
  ->getHTML();

#output: <span style="color: #808080"><em>Added later 2 h 48 min 43 s:</em></span><br>

parse

Parserus parse ( string $text [, array $opts = array() ] )

This method builds a tree of tags from the text containing bb-codes. / Метод строит дерево тегов из текста содержащего bb-коды.

$text
Processed text. / Обрабатываемый текст.

$opts
Array of options. / Массив опций.

  • 'root' => Name of a root bb-code. / Имя корневого bb-кода.
  • 'strict' => Flag (true/false) of strict check of bb-codes. / Флаг (true/false) строгой проверки bb-кодов.
  • 'depth' => (v 0.9.2+) Maximum depth of the tags tree with strict error search mode. / Максимальная глубина дерева тегов при строгом режиме поиска ошибок.

getText

string getText ( )

This method returns the text without bb-codes constructed based on a tree of tags. / Метод возвращает текст без bb-кодов построенный на основании дерева тегов.

Example

$parser = new Parserus();

echo $parser->setBBCodes([
    ['tag' => 'table',
     'type' => 'table',
     'tags_only' => true,
     'self_nesting' => 3,
     'attrs' => [
         'No_attr' => true,
         'style' => true,
         'align' => true,
         'background' => true,
         'bgcolor' => true,
         'border' => true,
         'bordercolor' => true,
         'cellpadding' => true,
         'cellspacing' => true,
         'frame' => true,
         'rules' => true,
     ],
     'handler' => function($body, $attrs) {
         $attr = '';
         foreach ($attrs as $key => $val) {
             $attr .= ' ' . $key . '="' . $val . '"';
         }
         return '<table' . $attr . '>' . $body . '</table>';
     },
    ],
    ['tag' => 'tr',
     'type' => 'tr',
     'parents' => ['table', 't'],
     'tags_only' => true,
     'self_nesting' => 3,
     'attrs' => [
         'No_attr' => true,
         'style' => true,
     ],
     'handler' => function($body, $attrs) {
         $attr = '';
         foreach ($attrs as $key => $val) {
             $attr .= ' ' . $key . '="' . $val . '"';
         }
         return '<tr' . $attr . '>' . $body . '</tr>';
     },
    ],
    ['tag' => 'th',
     'type' => 'block',
     'parents' => ['tr'],
     'self_nesting' => 3,
     'attrs' => [
         'No_attr' => true,
         'style' => true,
         'colspan' => true,
         'rowspan' => true,
     ],
     'handler' => function($body, $attrs) {
         $attr = '';
         foreach ($attrs as $key => $val) {
             $attr .= ' ' . $key . '="' . $val . '"';
         }
         return '<th' . $attr . '>' . $body . '</th>';
     },
    ],
    ['tag' => 'td',
     'type' => 'block',
     'parents' => ['tr'],
     'self_nesting' => 3,
     'attrs' => [
         'No_attr' => true,
         'style' => true,
         'colspan' => true,
         'rowspan' => true,
     ],
     'handler' => function($body, $attrs) {
         $attr = '';
         foreach ($attrs as $key => $val) {
             $attr .= ' ' . $key . '="' . $val . '"';
         }
         return '<td' . $attr . '>' . $body . '</td>';
     },
    ],
    ['tag' => 'email',
    'type' => 'email',
    'attrs' => [
        'Def' => [
            'format' => '%^[^\x00-\x1f\s]+?@[^\x00-\x1f\s]+$%',
        ],
        'No_attr' => [
            'body_format' => '%^[^\x00-\x1f\s]+?@[^\x00-\x1f\s]+$%D',
            'text_only' => true,
        ],
    ],
    'handler' => function($body, $attrs) {
        if (empty($attrs['Def'])) {
            return '<a href="mailto:' . $body . '">' . $body . '</a>';
        } else {
            return '<a href="mailto:' . $attrs['Def'] . '">' . $body . '</a>';
        }
    },
    'text_handler' => function($body, $attrs) {
        if (empty($attrs['Def'])) {
            return $body;
        } else {
            return $body . ' ' . $attrs['Def'];
        }
    },
   ],
])->parse('
[table align=right border=1 bordercolor=#ccc      cellpadding=5 cellspacing=0 style="border-collapse:collapse; width:500px"]
		[tr]
			[th style="width:50%"]Position[/th]
			[th style=width:50%]Astronaut[/th]
		[/tr]
		[tr]
			[td]Commander[/td]
			[td]Neil A. Armstrong[/td]
		[/tr]
		[tr]
			[td]Command Module Pilot[/td]
			[td]Michael Collins[/td]
		[/tr]
		[tr]
			[td]Lunar Module Pilot[/td]
			[td]Edwin "Buzz" E. Aldrin, Jr.[/td]
		[/tr]
[/table]
[email=spam@mail.ru]My email[/email]
[email]superspam@mail.ru[/email]
')->getText();

#output:
#
#Position Astronaut Commander Neil A. Armstrong Command Module Pilot Michael Collins Lunar Module Pilot Edwin "Buzz" E. Aldrin, Jr.
#My email spam@mail.ru
#superspam@mail.ru
#

getHtml

string getHtml ( )

This method returns HTML constructed based on a tree of tags. / Метод возвращает HTML построенный на основании дерева тегов.


getCode

string getCode ( )

This method returns the text with bb-codes constructed based on a tree of tags. / Метод возвращает текст с bb-кодами построенный на основании дерева тегов.

Example

$parser = new Parserus();

echo $parser->setBBCodes([
    ['tag' => 'table',
     'type' => 'table',
     'tags_only' => true,
     'self_nesting' => 3,
     'attrs' => [
         'No_attr' => true,
         'style' => true,
         'align' => true,
         'background' => true,
         'bgcolor' => true,
         'border' => true,
         'bordercolor' => true,
         'cellpadding' => true,
         'cellspacing' => true,
         'frame' => true,
         'rules' => true,
     ],
     'handler' => function($body, $attrs) {
         $attr = '';
         foreach ($attrs as $key => $val) {
             $attr .= ' ' . $key . '="' . $val . '"';
         }
         return '</p><table' . $attr . '>' . $body . '</table><p>';
     },
    ],
    ['tag' => 'tr',
     'type' => 'tr',
     'parents' => ['table', 't'],
     'tags_only' => true,
     'self_nesting' => 3,
     'attrs' => [
         'No_attr' => true,
         'style' => true,
     ],
     'handler' => function($body, $attrs) {
         $attr = '';
         foreach ($attrs as $key => $val) {
             $attr .= ' ' . $key . '="' . $val . '"';
         }
         return '<tr' . $attr . '>' . $body . '</tr>';
     },
    ],
    ['tag' => 'th',
     'type' => 'block',
     'parents' => ['tr'],
     'self_nesting' => 3,
     'attrs' => [
         'No_attr' => true,
         'style' => true,
         'colspan' => true,
         'rowspan' => true,
     ],
     'handler' => function($body, $attrs) {
         $attr = '';
         foreach ($attrs as $key => $val) {
             $attr .= ' ' . $key . '="' . $val . '"';
         }
         return '<th' . $attr . '>' . $body . '</th>';
     },
    ],
    ['tag' => 'td',
     'type' => 'block',
     'parents' => ['tr'],
     'self_nesting' => 3,
     'attrs' => [
         'No_attr' => true,
         'style' => true,
         'colspan' => true,
         'rowspan' => true,
     ],
     'handler' => function($body, $attrs) {
         $attr = '';
         foreach ($attrs as $key => $val) {
             $attr .= ' ' . $key . '="' . $val . '"';
         }
         return '<td' . $attr . '>' . $body . '</td>';
     },
    ],
])->parse('
[table align=right border=1 bordercolor=#ccc      cellpadding=5 cellspacing=0 style="border-collapse:collapse; width:500px"]
		[tr]
			[th style="width:50%"]Position[/th]
			[th style=width:50%]Astronaut[/th]
		[/tr]
		[tr]
			[td]Commander[/td]
			[td]Neil A. Armstrong[/td]
		[/tr]
		[tr]
			[td]Command Module Pilot[/td]
			[td]Michael Collins[/td]
		[/tr]
		[tr]
			[td]Lunar Module Pilot[/td]
			[td]Edwin "Buzz" E. Aldrin, Jr.[/td]
		[/tr]
[/table]
')->getCode();

#output:
#[table align="right" border="1" bordercolor="#ccc" cellpadding="5" cellspacing="0" style="border-collapse:collapse; width:500px"]
#		[tr]
#			[th style=width:50%]Position[/th]
#			[th style=width:50%]Astronaut[/th]
#		[/tr]
#		[tr]
#			[td]Commander[/td]
#			[td]Neil A. Armstrong[/td]
#		[/tr]
#		[tr]
#			[td]Command Module Pilot[/td]
#			[td]Michael Collins[/td]
#		[/tr]
#		[tr]
#			[td]Lunar Module Pilot[/td]
#			[td]Edwin "Buzz" E. Aldrin, Jr.[/td]
#		[/tr]
#[/table]
#

detectUrls

Parserus detectUrls ( )

This method looks for references in text nodes and creates on their place nodes with the url bb-codes. / Метод ищет в текстовых узлах ссылки и создает на их месте узлы с bb-кодами url.

For reduction of loading to use when saving, but not in case of an output / Для уменьшения нагрузки использовать при сохранении, а не при выводе.

Example

$parser = new Parserus();

echo $parser->setBBCodes([
    ['tag' => 'url',
     'type' => 'url',
     'parents' => ['inline', 'block'],
     'attrs' => [
         'Def' => [
             'format' => '%^[^\x00-\x1f]+$%',
         ],
         'No_attr' => [
             'body format' => '%^[^\x00-\x1f]+$%D',
         ],
     ],
     'handler' => function($body, $attrs, $parser) {
#...
     },
    ],
])->parse('Hello www.example.com World!')
  ->detectUrls()
  ->getCode();

#output: Hello [url]www.example.com[/url] World!

stripEmptyTags

bool stripEmptyTags ( [ string $mask = '' [, bool $flag = false ]] )

This method deletes empty tags from a tree of tags. / Метод удаляет пустые теги из дерева.

$mask
Mask of characters which aren't considered in case of determination of emptiness of text nodes. / Маска символов, которые не учитываются при определении пустоты текстовых узлов.

$flag
If true, then in case of an empty tree it isn't cleared, and will remain without changes, but the error which will be displayed in getErrors() will be left. / Если true, то при пустом дереве оно не будет очищено, а останется без изменений, но будет оставлена ошибка, которая отобразится в getErrors().

For reduction of loading to use when saving, but not in case of an output / Для уменьшения нагрузки использовать при сохранении, а не при выводе.

Example

$parser = new Parserus();

$parser->addBBCode([
    'tag' => 'b',
    'handler' => function($body) {
        return '<b>' . $body . '</b>';
    }
])->addBBcode([
    'tag' => 'i',
    'handler' => function($body) {
        return '<i>' . $body . '</i>';
    },
]);

# №1

var_dump($parser->parse("[i][b] [/b][/i]")->stripEmptyTags());

#output: boolean false

echo $parser->getCode();

#output: [i][b] [/b][/i]

echo "\n\n";

# №2

var_dump($parser->parse("[i][b] [/b][/i]")->stripEmptyTags(" \n", true));

#output: boolean true

echo $parser->getCode();

#output: [i][b] [/b][/i]

var_dump($parser->getErrors());

#output: array (size=1)
#  0 => string 'Все теги пустые' (length=28)

echo "\n\n";

# №3

var_dump($parser->parse("[i][b] [/b][/i]")->stripEmptyTags(" \n"));

#output: boolean true

echo $parser->getCode();

#output:

var_dump($parser->getErrors());

#output: array (size=0)
#  empty

getErrors

array getErrors ( [ array $lang = array() , [ array $errors = array() , [ bool $retTpl = false ]]] )

This method returns an array of errors. / Метод возвращает массив ошибок.

$lang
Array of the description of errors. / Массив с описанием ошибок.

$errors
Array which is added by errors. / Массив, который дополняется ошибками.

$retTpl (v 1.1.0+)
Flag to return the result as an array with a template in the first element for each error. / Флаг возрата результата в виде массива с шаблоном в первом элементе для каждой ошибки.

Example

$parser = new Parserus();

$parser->addBBCode([
    'tag' => 'b',
    'handler' => function($body) {
        return '<b>' . $body . '</b>';
    }
])->addBBcode([
    'tag' => 'i',
    'handler' => function($body) {
        return '<i>' . $body . '</i>';
    },
]);

$parser->parse("[i][b] [/b][/i]")->stripEmptyTags(" \n", true);

$err = [
    1 => '[%1$s] is in the black list',
    2 => '[%1$s] is absent in the white list',
    3 => '[%1$s] can\'t be opened in the [%2$s]',
    4 => '[/%1$s] was found without a matching [%1$s]',
    5 => '[/%1$s] is found for single [%1$s]',
    6 => 'There are no attributes in [%1$s]',
    7 => 'Primary attribute is forbidden in [%1$s=...]',
    8 => 'Secondary attributes are forbidden in [%1$s ...]',
    9 => 'The attribute \'%2$s\' doesn\'t correspond to a template in the [%1$s]',
    10 => '[%1$s ...] contains unknown secondary attribute \'%2$s\'',
    11 => 'The body of [%1$s] doesn\'t correspond to a template',
    12 => '[%1$s] was opened within itself, this is not allowed',
    13 => 'In the [%1$s] is absent mandatory attribute \'%2$s\'',
    14 => 'All tags are empty',
    15 => 'The depth of the tag tree is greater than %1$s',
    16 => '[%1$s] is enclosed in itself more than %2$s times',
];

var_dump($parser->getErrors($err));

#output: array (size=1)
#  0 => string 'All tags are empty' (length=18)

e

string e ( string $text )

This method will transform special characters to HTML entities. / Метод преобразует специальные символы в HTML-сущности.

Example

$parser = new Parserus();

echo $parser->e("<'abcde'>");

#output: &lt;&apos;abcde&apos;&gt;

de

string de ( string $text )

(v 1.2.0+)

This method will transform special HTML entities back to characters. / Метод преобразует специальные HTML-сущности обратно в соответствующие символы.


getIds

array getIds ( string ...$tags )

(v 1.4.0+)

This method returns an array of the form "id => tag name" built on the basis of a tree of tags. / Метод возвращает массив вида "id => имя тега" построенный на основе дерева тегов.

If $tags is not empty, then only those tags are returned. / Если указаны $tags, то возвращаются только они.