Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > BBCode, как осуществить?


Автор: ElusivE 28.1.2006, 12:14
Вот мне интерестно, как сделать ББКод? собственно мне нужно, чтобы когда я ввожу
Код

[url=http://lol.ru/]LOL.RU[/url] 

это все заменялось на
Код

<a href=http://lol.ru/>LOL.RU</a>


Как это сделать?
Добавлено @ 12:19
Кстати, прошу обратить внимание, что познание пхп у меня среднее

Автор: Mal Hack 28.1.2006, 12:53
А поиском попользоваться?
Так, чтобы на виду лежало, выкладываю часть своего старого парсера.

Автор: 2man 28.1.2006, 14:07
Балин! не успел smile
Вот пример типичного BB-кода:
Код

$txt = eregi_replace ("(.*)\\[url\\](.*)\\[/url\\](.*)","\\1<a href=\\2>\\2</a>\\3",$txt);

Добавлено @ 14:11
А если по-сложнее, то:
Код

$txt = preg_replace( "#(^|\s)((http|https|news|ftp)://\w+[^\s\[\]]+)#ie"  , "\$this->regex_build_url(array('html' => '\\2', 'show' => '\\2', 'st' => '\\1'))", $txt );

regex_build_url() :
Код

function regex_build_url($url=array()) {

                $skip_it = 0;

                // Make sure the last character isn't punctuation.. if it is, remove it and add it to the
                // end array

                if ( preg_match( "/([\.,\?]|!)$/", $url['html'], $match) )
                {
                        $url['end'] .= $match[1];
                        $url['html'] = preg_replace( "/([\.,\?]|!)$/", "", $url['html'] );
                        $url['show'] = preg_replace( "/([\.,\?]|!)$/", "", $url['show'] );
                }

                // Make sure it's not being used in a closing code/quote/html or sql block

                if (preg_match( "/\[\/(html|quote|code|sql)/i", $url['html']) )
                {
                        return $url['html'];
                }

                // clean up the ampersands
                $url['html'] = preg_replace( "/&amp;/" , "&" , $url['html'] );

                // Make sure we don't have a JS link
                $url['html'] = preg_replace( "/javascript:/i", "java script: ", $url['html'] );

                // Do we have http:// at the front?

                if ( ! preg_match("#^(http|news|https|ftp|aim)://#", $url['html'] ) )
                {
                        $url['html'] = 'http://'.$url['html'];
                }

                //-------------------------
                // Tidy up the viewable URL
                //-------------------------

                if (preg_match( "/^<img src/i", $url['show'] )) $skip_it = 1;

                $url['show'] = preg_replace( "/&amp;/" , "&" , $url['show'] );
                $url['show'] = preg_replace( "/javascript:/i", "javascript: ", $url['show'] );

                if ( (strlen($url['show']) -58 ) < 3 )  $skip_it = 1;

                // Make sure it's a "proper" url

                if (!preg_match( "/^(http|ftp|https|news):\/\//i", $url['show'] )) $skip_it = 1;

                $show     = $url['show'];

                if ($skip_it != 1) {
                        $stripped = preg_replace( "#^(http|ftp|https|news)://(\S+)$#i", "\\2", $url['show'] );
                        $uri_type = preg_replace( "#^(http|ftp|https|news)://(\S+)$#i", "\\1", $url['show'] );

                        $show = $uri_type.'://'.substr( $stripped , 0, 35 ).'...'.substr( $stripped , -15   );
                }

                return $url['st'] . "<a href='".$url['html']."' target='_blank'>".$show."</a>" . $url['end'];

        }



Автор: podlom 7.10.2008, 19:09
BBCode это не только тег url. Хотелось бы увидеть реализацию замены и других тегов типа: h1, h2, b, i, img и bq, а так же размышления по-поводу того как лучше реализовать и какие проблемы могут возникать.

Автор: SneG0K 7.10.2008, 19:53
Цитата(podlom @  7.10.2008,  18:09 Найти цитируемый пост)
какие проблемы

Какие блин проблемы? Это просто замена текста одного другим!
Цитата(podlom @  7.10.2008,  18:09 Найти цитируемый пост)
реализацию замены и других тегов

Так же как и тег LINK

Автор: sTa1kEr 7.10.2008, 21:18
http://php.net/bbcode

Автор: Sunvas 8.10.2008, 00:29
sTa1kEr, а "обратно" парсить он умеет? Из ХТМЛа в BB? - Иначе ж как тогда поступать: в базе данных хранить и каждый раз парсить? smile 

Автор: sTa1kEr 8.10.2008, 05:32
Цитата(Sunvas @  8.10.2008,  01:29 Найти цитируемый пост)
в базе данных хранить и каждый раз парсить?

Именно. "Обратно парсить" bbcode - это, имхо, моветон.

Автор: skyboy 8.10.2008, 08:41
Цитата(Sunvas @  7.10.2008,  23:29 Найти цитируемый пост)
в базе данных хранить и каждый раз парсить?

во-первых, рано или поздно захочешь расширить схему кодов. например, добавишь новые смайлы. а тут - сюрприз: старые сообщения храняться уже ХТМЛными и их не преобразуешь.
кроме того, htmlspecialchars ты тоже до записи в базу делаешь? 

Автор: Sunvas 8.10.2008, 18:10
Цитата(sTa1kEr @  8.10.2008,  05:32 Найти цитируемый пост)
Именно. "Обратно парсить" bbcode - это, имхо, моветон.

Это тупо маять сервер фигней (жрет производительность): проще один раз отпарсить, а потом только показывать результат вываливая содержимое базы на страницу. IPB так и делает.


Цитата(skyboy @  8.10.2008,  08:41 Найти цитируемый пост)
добавишь новые смайлы

Ну добавлю и что дальше? Формат смайлов - один и тот же.

Цитата(skyboy @  8.10.2008,  08:41 Найти цитируемый пост)
а тут - сюрприз: старые сообщения храняться уже ХТМЛными и их не преобразуешь.

Не понял хода мысли: зачем к уже сохраненным сообщениям дописывать смайлы?  smile 


Цитата(skyboy @  8.10.2008,  08:41 Найти цитируемый пост)
кроме того, htmlspecialchars ты тоже до записи в базу делаешь? 

Нет. Зачем?

Автор: DioNiR 8.10.2008, 18:36
Цитата
во-первых, рано или поздно захочешь расширить схему кодов.
 
А что тут сложного то? Добавил и всё.

Цитата
например, добавишь новые смайлы. а тут - сюрприз: старые сообщения храняться уже ХТМЛными и их не преобразуешь.

Как сказал уже Sunvas

Цитата
кроме того, htmlspecialchars ты тоже до записи в базу делаешь?

Цитата
Нет. Зачем?

Значит ты пускаешь спокойный HTML код в ход?

Автор: HackMan 8.10.2008, 19:10
Есть два метода хранения данных: с постобработкой (без предварительной обработки) и предобработкой. Или попросту говоря - сырые данные (raw data), которые получены от пользователя, или данные, которые уже обработаны (например, прошли через htmlspecialchars())

Оба способа активно используются. Здесь же надо определиться со структурой сайта, в частности с тем, как эти данные будут использоваться. Например, если это комментарии пользователей, к товару, которые будут просто отображаться, и никаких больше действий над ними не будет производиться, тогда имеет смысл функцию htmlspecialchars() применить (обрабатывать данные) до занесения комментария в базу, что бы не делать этого каждый раз перед выводом, ведь это лишняя нагрузка на сервер. Рассмотрим теперь второй пример. На этом же сайте есть автоцензорный фильтр, который будет вырезать из комментария все маты и заменять их на ***. Этот фильтр наверняка будет дополняться новыми словами, и что бы не было такого, что в фильтр добавили новое слово, и в новых комментариях оно не проходит, а в старых отображается, имеет смысл применять автоцензор (обрабатывать данные) уже после занесения в базу, до вывода в браузер.

Вывод: если хранить данные с предобработкой - выигрываем в скорости выполнения и проигрываем в универсальности, а с постобработкой - с точностью наоборот. И выбор, каким из методов пользоваться, ложится на плечи разработчика.

Автор: sTa1kEr 8.10.2008, 22:28
Цитата(Sunvas @  8.10.2008,  19:10 Найти цитируемый пост)
жрет производительность

1. На это потребуется совсем не много ресурсов, не больше чем любому шаблонизатору, str_replace или тому же htmlspecialchars()
2. Кеширование никто не отменял. А если уж говорить про проекты с высокой нагрузкой, то тем более большая часть данных как правило берется из кеша.

Цитата(Sunvas @  8.10.2008,  19:10 Найти цитируемый пост)

Нет. Зачем? 

Цитата(DioNiR @  8.10.2008,  19:36 Найти цитируемый пост)
А что тут сложного то? Добавил и всё.

Пример, винград, быстрая цитата. Ты нажал на быструю цитату и в нее подставился id поста, по которому затем можно получить дату, имя, etc. Однако, если пользователь решит отредактировать сообщение, то по дате и имени получить id уже не получится. Хорошо еще если можно как-то ссылку распознать и распарсить, и затем только из нее добыть этот id... Иначе данные, введенные пользователем, потеряны.

Или добавлени к сообщению, ставится метка времени, но для отображения никому не нужна эта метка, вместо нее пишется пройденное время. Если добавить в базу именнов таком виде - данные, введенные пользователем, потеряны.


Цитата(DioNiR @  8.10.2008,  19:36 Найти цитируемый пост)
например, добавишь новые смайлы. а тут - сюрприз: старые сообщения храняться уже ХТМЛными и их не преобразуешь.

Как сказал уже Sunvas

В каком виде смайлы должны хранятся в базе, что бы не пришлось делать постобработку сообщения перед выводом? В виде ссылок на конечные картинки. А теперь представь, что набор смайликов поменялся и ссылки уже должны ввести на совсем другие картинки. Кроме того опять же редактирование постов - ты понаставил смайликов ":)", редактируешь пост и видешь вместо своих смайликов кучу длиннющих тегов [ url ]


Цитата(DioNiR @  8.10.2008,  19:36 Найти цитируемый пост)
Значит ты пускаешь спокойный HTML код в ход?

Нет, htmlspecialchars необходимо использовать перед выводом, а не перед добавлением в базу.

Автор: nerezus 8.10.2008, 23:03
ооооо....
google://State Machine алгоритм
имхо на регекспах глупо делать - ибо человеческий фактор сыграет роль при куче регекспов, а потом XSS будут.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)