ок, щас распознавалку бб кодов распишу подробно (самописка)
---добавлено---
Почемуто многие самописные сайты разрешают штмл в своей админке, уж не из-за того ли, что создателям "влом" писать распознавалку бб тегов?
вот простейший пример:
[php]<?
// исходное сообщение:
// ------------------------------------------------------
$str='
Памагите, ничаво не работает! Вот пример:
[ph p ]
// comment
# comment
phpinfo();
[/ph p]
содран с:
http://yandex.ru/
ляляля ляляля
ПОМОГИТЕ!!!
[ph p]
for ($i=0; $i<100; $i++) {
ping("-f","www.ru");
}
[/ph p]
[HIDE]тут хайд))) токо что в нем написать?[/HIDE]
<?
echo "<a href=http://php.spb.ru/chat/>click here!</a>";
phpinfo();
?>
';
// ------------------------------------------------------
// подавить предупреждения (в highlight_string есть глюки)
error_reporting(0);
// функция подсвечивания одного куска текста
function _my_($s,$a1,$a2) {
if ($a1!="<?") { $a1="<?"; $a2="?>"; }
$s=str_replace("\\\"","\"",$s);
ob_start();
highlight_string($a1.$s.$a2);
$s=ob_get_contents();
ob_end_clean();
return $s;
}
// ищем в тексте все куски между <?... или
PHP код:
...
$str=preg_replace("!(\[php\]|<\?)(.*?)(\[/php\]|\?>)!ise","_my_('\\2','\\1','\\3')",$str);
$order = array('[center]','[/center]','[left]','[/left]','[right]','[/right]','[b]','[/b]');
$replace = array('<div align="center">','</div>','<div align="left">','</div>','<div align="right">','</div>','<B>','</B>');
$str = str_replace($order, $replace, $str);
// хайд )
if($_GET['member']==='1')
{
$str = ereg_replace("\[HIDE\](.*)\[\/HIDE\]","<HR>\\1<HR>", $str);
$str = ereg_replace("\[URL\]([[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/])\[\/URL\]","<a href=\"\\1\" target=\"blank\">\\1</a>", $str);
}else
{
$str = ereg_replace("\[HIDE\](.*)\[\/HIDE\]","<HR><b>Стань мембром! или не видать тебе хайдов и линков!!!</b><HR>", $str);
$str = ereg_replace("\[URL\]([[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/])\[\/URL\]","<b>Стань мембром! или не видать тебе хайдов и линков!!!</b>", $str);
}
echo $str;
?>
тут мы использовали несколько красивых регулярок для наших бб тегов:
PHP код:
$str = ereg_replace("\[HIDE\](.*)\[\/HIDE\]","<HR>\\1<HR>", $str);
- заменяет текст, между [HIDE] и [/HIDE] на тот же текст, но в тегах <HR>, чтобы выделить его из общей массы. (конечно, нужно юзать ксс, чтобы было читабельнее))
PHP код:
$str = ereg_replace("\[URL\]([[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/])\[\/URL\]","<a href=\"\\1\" target=\"blank\">\\1</a>", $str);
а эта регулярка обрабатывает урл адрес. ЭТО ТОЛЬКО МОДЕЛЬ! нужно во-первых, текст, отображаемый пользователю разбивать на участки, во избежание XSS атак, да и фильтровать его

Заметьте, срабатывают эти регулярки, только если if($_GET['member']==='1') - истинно (так мы упростили систему авторизации), если же это ложно, то вместо хайдов выводится:
Код HTML:
<HR><b>Стань мембром! или не видать тебе хайдов и линков!!!</b><HR>
и вместо линков то же самое, сделано это чуть измененными регулярками:
PHP код:
$str = ereg_replace("\[HIDE\](.*)\[\/HIDE\]","<HR><b>Стань мембром! или не видать тебе хайдов и линков!!!</b><HR>", $str);
$str = ereg_replace("\[URL\]([[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/])\[\/URL\]","<b>Стань мембром! или не видать тебе хайдов и линков!!!</b>", $str);
К тому же, мы и заменяем теги [center], [b] на аналогичные штмл вот таким кодом:
PHP код:
$order = array('[center]','[/center]','[left]','[/left]','[right]','[/right]','[b]','[/b]');
$replace = array('<div align="center">','</div>','<div align="left">','</div>','<div align="right">','</div>','<B>','</B>');
$str = str_replace($order, $replace, $str);
теперь о проблемах такой схемы. заметили, что я выложил пшп код не в тегах ?
а почему? дело в том, что вобла пользуется аналогичным алгоритмом, который я описал, ей наплевать на правильную "скобочную" последовательность! как например [p hp][p hp][/ph p][/ph p] такой код она сглотит как: [ph p][p hp][/p hp] и отдельно стоящий [/ph p]. плохо, правда? как же этого избежать? можно юзать правильно настроенные регулярки в отношении жадности, а можно пойти совсем другим алгоритмом, его я опишу лиш на словах, т.к. нормальную версию кодю уже недельку)
суть, мы разбиваем сообщение на "части" учитывая правильные скобочные последовательности, и работаем с ними функциями, например, в теге пшп запрещены теги [b] и т.д.
Но, почему же вбуллетин не использует это? да потому, что тогда полетит к черту вся система плагиноВ, точнее она не полетит, ее можно будет сделать, но уже только с помощью графов (более простого метода мне в голову пока не лезет

). а так каждый модуль, как например тег "оффтом" на аллчитс добавляет еще 1 регулярку.
Тема очень обширная, поэтому если есть вопросы, пишите)
да и от предложений тоже не откажусь))))
ЗЫ проблему с [php] решил, просто пробелов понавставлял)))