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, а что ошиблись?
Условие: парсинг первого уровня -- работает.
Теги исключительно словоподобные -- работает.
Открывающий и закрывающий теги одинаковые -- тоже работает
мой вариант сожрал, как не странно ))
так замените на preg_replace('/\[(\w+)(\]|.*\])(.*)\[\/\\1\]/imU', '$3', $input);
и на вас снова наступит счастье
(\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);
решение не претендует на мегакомпактность, но зато достаточно универсально
регулярка получилась достаточно универсальной. то-есть если ее слегка доработать, то она вполне подойдет для перепила BB кодов в HTML даже с учетом рекурсии
с вас 30 евро
Дух уже утомлен по самое неболуйся. это да