silicoid

Рейтинг
171
Регистрация
13.10.2014

demiux, Так текст в скобках должен выводиться вместе со скобками (так как он не является ббкодом).

если вам нужно выпилить скобки, пройдитесь второй раз чистилкой

Кстати. на счет портала.

я тут на основе регулярки, выше, накидал вот такую штуку

рекурсивный перебор ББ кодов

разрешенные бб-коды описаны массивом в getTagsInfo

replace_recursive($input, $clean) - собсно функция замещения

$input - string - с ббкодами

$clean - boolean - флаг финальной зачистки;


$input = '[span class="menu-123"][a href="/kontakt" title="Контакт"]Контакт[/a][/span]
каля маля jjjjjjj [bbfgdfggfd]каля-------маля[/bbfgdfggfd]
[xc]довыпил[/bd]';


function getTagsInfo()
{
return array(
//<b>
'b' => array(
'replace' => 'b',
'use_html' => TRUE,
'allow_mod' => FALSE,
),

//<a>
'a' => array(
'replace' => 'a',
'use_html' => TRUE,
'allow_mod' => TRUE,
),

//<span>
'span' => array(
'replace' => 'span',
'use_html' => TRUE,
'allow_mod' => TRUE,
),
);
}


function callBack($matches)
{
$tags = getTagsInfo();
$mod = '';

/* check for recursive */
$sub_matches = preg_match('/\[(\w+)(.*)\](.*)\[\/\\1\]/imU', $matches[3],$subpatterns);
if($sub_matches > 0)
$matches[3] = replace_recursive($matches[3]);

/* parse */
if (array_key_exists($matches[1],$tags) && !empty($tags[$matches[1]]['use_html']))
{
if (isset($tags[$matches[1]]['allow_mod']) && $tags[$matches[1]]['allow_mod'] === TRUE)
$mod = ' '.trim($matches[2]);

return '<'.$tags[$matches[1]]['replace'].$mod.'>'.$matches[3].'</'.$tags[$matches[1]]['replace'].'>';
}
else
return $matches[3];

}


function replace_recursive($input, $clean=FALSE)
{
$content = preg_replace_callback('/\[(\w+)(.*)\](.*)\[\/\\1\]/imU', 'callBack', $input);

if ($clean)
$content = preg_replace('/\[\/*(\w+)(.*)\]/imU', '', $content);

return $content;
}


print_r (replace_recursive($input, TRUE) );

может кому пригодится

кстати. Можно мой вариант еще подсократить, preg_replace('/\[(\w+).*\](.*)\[\/\1\]/imU', '$2', $input)

[offtop mode on]

кстати в Яндекс нужны хорошие программисты на Перле. С ног сбились найти не могут!

---------- Добавлено 17.02.2017 в 14:12 ----------

Aisamiery, а что ошиблись?

Условие: парсинг первого уровня -- работает.

Теги исключительно словоподобные -- работает.

Открывающий и закрывающий теги одинаковые -- тоже работает

demiux:
Это туда подставьте

мой вариант сожрал, как не странно ))

miltorg:
Так я ему на это и указал увеличив число букв в теге от первоначального

так замените на preg_replace('/\[(\w+)(\]|.*\])(.*)\[\/\\1\]/imU', '$3', $input);

и на вас снова наступит счастье

miltorg:
Не работает

(\w{1,3}) в выражении означает, что тэг может быть любым символьным из 1-3 букв если вы туда напишете 12букаф оно работать не будет

(\w+) исправит эту "проблему"

так даже короче будет, только регулярка будет гораздо медленнее работать.

добавлю сюда, чтоб 2 раза не вставать


$input = '[li class="menu-123"][a href="/kontakt" title="Контакт"]Контакт[/a][/li][ba]каля маля[/ba] jjjjjjj [bb]каля-------маля[/bb]';
print preg_replace('/\[(\w{1,3})(\]|.*\])(.*)\[\/\\1\]/imU', '$3', $input);

решение не претендует на мегакомпактность, но зато достаточно универсально


$input = '[li class="menu-123"][a href="/kontakt" title="Контакт"]Контакт[/a][/li][ba]каля маля[/ba] jjjjjjj [bb]каля-------маля[/bb]';
print preg_replace('/\[(\w{1,3})(\]|.*\])(.*)\[\/\\1\]/imU', '$3', $input);

регулярка получилась достаточно универсальной. то-есть если ее слегка доработать, то она вполне подойдет для перепила BB кодов в HTML даже с учетом рекурсии

с вас 30 евро

Фома:
томление духа

Дух уже утомлен по самое неболуйся. это да

Всего: 1685