ББ коды

1.46K
.

[type=1]текст[/type]
заменить на
<marquee behavior="alternate" direction="left" bgcolor="#ffcc00">текст</marquee>
---
[type=2]текст[/type]
заменить на
<marquee>текст</marquee>
---
[type=3]текст[/type]
заменить на
<td>текст</td>

.

dilp, функцию чуть подправил, но принцип тот же - в массив добавляешь текст для подстановки, а в bb-теге указываешь номер ключа для соответствующего значения. Код проверил, всё ок. Или в песочницу сбросить?

code (+/-)
/*
[type=1]текст[/type]
заменить на
<marquee behavior="alternate" direction="left" bgcolor="#ffcc00">текст</marquee>
---
[type=2]текст[/type]
заменить на
<marquee>текст</marquee>
---
[type=3]текст[/type]
заменить на
<td>текст</td>
*/

$str = '[type=1]текст[/type]';
//$str = '[type=2]текст[/type]';
//$str = '[type=3]текст[/type]';

$types = [
    'marquee behavior="alternate" direction="left" bgcolor="#ffcc00"',
    'marquee',
    'td',
];

$str = preg_replace_callback(
    '~\[type=(\d+)]([^[]+)\[/type]~',
    function($m) use($types){
        $key = $m[1];
        $txt = $m[2];
        if (isset($types[--$key])) {
            $left = $types[$key];
            $right = preg_replace("~(\S+).*~", '$1', $left);
            return "<$left>{$txt}</$right>";
        }
    },
    $str
);

echo $str;

PS: В 26-й строке все скобки на месте ))
.

давай

.
# dilp (11.12.2019 / 23:04)
давай
https://ideone.com/HS12DM
Результат смотри под строкой stdout
.

работает

.
# dilp (11.12.2019 / 23:18)
работает
как по мне, так это не удобно, т.к. юзеру нужно будет "помнить", какой нужно использовать номер, что бы в теге добавился к примеру td.
.

ДоХтор, это нужно в первую очередь мне

.
# dilp (11.12.2019 / 23:38)
ДоХтор, это нужно в первую очередь мне
Тогда попробуй ещё такой вариант, он вроде бы устойчивее к ошибкам
code (+/-)
$str = '[type=1]текст[/type]';

$types = [
    'marquee behavior="alternate" direction="left" bgcolor="#ffcc00"',
    'marquee',
    'td'
];

$str = preg_replace_callback(
    '~\[type=(\d+)]([^[]+)\[/type]~',
    function($m) use($types){
        $key = $m[1];
        $txt = $m[2];
        if (isset($types[--$key])) {
            $tag = $types[$key];
            $attr = '';
            if (strpos($tag, ' ')) {
                [$tag, $attr] = explode(' ', $tag, 2);
                $attr = " $attr";
            }
            return "<$tag{$attr}>{$txt}</$tag>";
        }
        return $m[0];
    },
    $str
);

echo $str;
.

а почему там могут быть ошибки?

.
# dilp (12.12.2019 / 00:37)
а почему там могут быть ошибки?
зависит от того, что в массиве передавать.
Всего: 20