Приветствую Вас на своем блоге! Как я и говорил в прошлой статье, сегодня мы будем писать обработчик bb кодов для нашей админки. Каким способом наш скрипт будет заменять bb коды на html? Все довольно просто. Мы с помощью функции preg_replace найдем в тексте bb код и заменим его Процедура нахождения и замена заменяемых строк будет осуществляться буквально 3-4 строчками php кода. Сам скриптик будет написан в модуле добавление постов, который мы писали в статье "Реализуем добавление постов через админ панель". Ну что ж.. Приступим к написанию скрипта?
Как я и говорил, писать его будем в нашем ранее написанном модуле. Так что открываем файл addcontent.php. Скрипт стоит писать сразу после того как мы заменили весь html на html сущности, то есть после этих строк:
$name_post = htmlspecialchars($name_post);
$txt_post = htmlspecialchars($txt_post);
$author_post = htmlspecialchars($author_post);
На что менять этот bb код? Самое простое это воспользоваться тегом <span> добавив к нему стиль font-weight:bold. Менять будем с помощью функции preg_replace, а не str_replace. Если вы знаете эти функции, то возможно возникнет вопрос, почему именно preg_replace? Я уже размышлял на этот счет в статье bb коды на php. Уж очень мне не нравится то, что если забыть закрыть bb тег то будут небольшие проблемы, поэтому использовать будем preg_replace. Давайте я сформулирую логику:
Как видите менять мы будем не по отдельности, то есть не bb код [ b ] на <span style="font-weight:bold;"> а [ /b ] на </span> а все вместе... Таким образом мы избежим ошибок, если вдруг удалим [ b ] или [ /b ] при наборе текста. Приступим к реализации. Вот код замены bb кода "b" на html, естественно с комментариями
//---------------------[b][/b]
preg_match_all("/\[b\](.*?)\[\/b\]/",$txt_post,$txt_bb);//Сохранили в переменную $txt_bb найденный текст между [b] и [/b]
//Заменяем по очереди bb код на html
for($i=0;isset($txt_bb[1][$i]);$i++)
$txt_post = preg_replace("/\[b\].*?\[\/b\]/s","<span style=\"font-weight:bold;\">".$txt_bb[1][$i]."</span>",$txt_post,1);
//---------------------[b][/b]
Для поиска мы используем регулярное выражение, о них можете почитать тут
Тут чутка посложнее, ибо нам необходимо помимо пути к изображению сохранить еще и позицию, при этом определить какая позиция. Стало быть используем if Вот код с комментариями:
//---------------------[img]
preg_match_all("/\[img url='(.*?)' pos='(.*?)'\]/s",$txt_post,$txt_bb);//Сохранили в переменную $txt_bb ссылку и позицию изображения
for($i=0;isset($txt_bb[1][$i]);$i++)
{
if($txt_bb[2][$i] != "")//Определяем есть ли позиция у изображения
{
//Если есть позиция, то определяем какая, и создаем свойство для тега <img>
if($txt_bb[2][$i] == "l")$align_img = " align=\"left\"";
if($txt_bb[2][$i] == "r")$align_img = " align=\"right\"";
if($txt_bb[2][$i] == "c")$align_img = " align=\"center\"";
}
else $align_img = "";//Если позиции нет, то не создаем свойство для тега
//Заменяем по очереди bb код на html
$txt_post = preg_replace("/\[img url='.*?' pos='.*?'\]/s","<img src=\"".$txt_bb[1][$i]."\" border=\"0px\"".$align_img.">",$txt_post,1);
}
//---------------------[img]
Тут тоже самое что при bb коде "b" Просто находим, сохраняем и заменяем. Вот код с комментариями:
//---------------------[a][/a]
//Заменяем по очереди bb код на html
preg_match_all("/\[a url='(.*?)'\](.*?)\[\/a\]/s",$txt_post,$txt_bb);//Сохранили в переменную $txt_bb ссылку и текст ссылки
for($i=0;isset($txt_bb[1][$i]);$i++)
$txt_post = preg_replace("/\[a url='.*?'\].*?\[\/a\]/s","<a href=\"".$txt_bb[1][$i]."\">".$txt_bb[2][$i]."</a>",$txt_post,1);
//---------------------[a][/a]
Теперь при добавление постов через админку, можно пользоваться bb кодами для придание тексту более специфичный вид. В следующей статье мы научим нашу админку переводить html код обратно в bb код, для того что бы можно было редактировать посты в точно таком же режиме, как и при добавление постов. Так же обучим редактор работать с bb кодами. Вообщем то на сегодня все, если есть какие то вопросы задавайте, отвечу, спасибо за внимание, у меня все!
Исходник |
Например, в чем Вы не разобрались?
[a][/a] [img] [end]. Только я не знаю, как на самом деле должна выглядеть эта панелька, может быть то, что у меня получилось и не верно вовсе. Хотелось бы в начале каждой статьи публиковать скрин с тем, что мы должны видеть и иметь в итоге. Визуально это бы помогло.
Теперь конкретно: ввожу текст нажимаю [b], в тексте появляются , пишу текст между , сохраняю пост, вижу этот текст в БД вместе с . Это правильно? Разбираю пока самый простой случай, т.к. с img вообще не получается добавить. Опишите, пожалуйста, последовательность действий при добавлении текста в новый пост с использовании bb-кодов.
Последовательность действий: вхожу в редактирование, рядом с каким-нибудь текстом прописываю путь к изображению, нажимаю, например, left, ОК, редактировать. В БД ничего не меняется. Может не верно прописываю путь - img\u33.jpg ?
Неплохо было бы изобрести диалог Open )).
img/u33.jpg
Я скрипт тестил, все нормально должно быть
admin/img/u33.jpeg.
Но, если Вы говорите что в БД ничего не меняется, то есть в БД у вас так и прописано:
[img url='admin/img/u33.jpeg' pos='l']
То дело в скрипте. Если же в БД прописано вот так:
<img src="admin/img/u33.jpeg" border="0px" align="left">
То дело скорее всего в пути изображения.
[img url='admin/img/u33.jpeg' pos='l'].
Это не правильно ?
1. Вы переходили к следующему посту?
2. Если не переходили, то добавляете в БД бб код через форму "добавить пост" или "редактировать пост"?
2. через редактировать пост
2. Если вы не вносили поправки в редактор (Эти поправки описаны в посте "Учим наш редактор понимать ВВ коды" ) то ББ коды в редакторе работать не будут.
Несмотря на то, что у меня не получилось с картинками, сейчас пытаюсь разобраться с категориями, пост
Доделываем редактор постов для нашей CMS. Что-то тоже не выходит ничего. Правда я не все шаги делала в пользовательской части.
Например, для категорий мы добавляли в БД новую колонку или нет? Если ее нужно добавить, какие у нее характеристики?
А пока у меня пишет ошибку
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:\home\localhost\www\000blog\admin\moduls\addcontent.php on line 79
Это строка функции function addcontent():
menu = mysql_fetch_array($allmenu);
Если у Вас ничего не получится, пришлите копию вашего проекта (лучше через форму контакты), я посмотрю, правда не сегодня, сейчас времени нет.
$name_post = htmlspecialchars($name_post);
$txt_post = htmlspecialchars($txt_post);
$author_post = htmlspecialchars($author_post);
или после?
preg_match_all("/\[a url='(.*?)'\](.*?)\[\/a\]/s",$txt_post,$txt_bb);//Сохранили в переменную $txt_bb ссылку и текст ссылки
for($i=0;isset($txt_bb[1][$i]);$i++)
$txt_post = preg_replace("/\[a url='.*?'\].*?\[\/a\]/s","<a href=\"".$txt_bb[1][$i]."\">".$txt_bb[2][$i]."</a>",$txt_post,1);
так же безполезно. Скопировал полностью код из исходника... ни че не изменилось
magic_quotes_gpc = On
Что означает: Все кавычки экранизируются еще будучи в переменной $_POST. Обработчик видит не вот такой бб код:
[a url='ссылка']http://ссылка.ru[/a]
а вот такой:
[a url=\'ссылка\']http://ссылка.ru[/a]
Само собой регулярное выражение не срабатывает. Самый действенный выход это отключить данную настройку, то есть в php.ini изменить
magic_quotes_gpc = On
на
magic_quotes_gpc = Off
Если моя теория верна, а она скорее всего верна, ведь других объяснений я найти не могу, то все должно заработать
P.S. Если не хотите отключать данную директиву, или нет возможности ее отключить, то можете попробовать переделать регулярное выражение. Но лучше отключите (на всех адекватных, ИМХО, хостингах она отключена)
http://rio-shaman.ru/index.php?blog=50
Если читали, то мне нужно больше информации... Например как именно выглядят теги (html теги) созданные редактором?
Он заменяет html символы "<" и ">" на код
так выгледит код ссылки <a href="ссылка">ссылка</a>
1. Либо в обработчике добавление постов, сразу после преобразования бб кодов в html код, используется функция htmlspecialchars
2. Либо существует какая то настройка в php.ini, о которой я не знаю, которая переделывает html код в аналог без ведома разработчика.
Первым делом посоветовал бы посмотреть что именно попало в базу данных, а именно открыть mysql phpmyadmin и глянуть в каком виде там ссылки лежат. Если не чистый html, а аналог, то проблема именно в коде добавление поста. Если же нет, то даже не знаю в чем проблема, ибо в коде редактирования постов все чисто и должно работать как надо...
http://rio-shaman.ru/index.php?blog=47