|
|
|
| Давайте сделаем liteforum лучше )
Наткнулся на utils.print_page.php – скрипт обработки BBCode(a) и улыбнулся )
utils.print_page.php:
<?php
////////////////////////////////////////////////////////////
// 2006-2007 (C) IT-студия SoftTime (http://www.softtime.ru)
////////////////////////////////////////////////////////////
// Функция обработки bbCode
////////////////////////////////////////////////////////////
function print_page($postbody)
{
// Разрезаем слишком длинные слова
$postbody = preg_replace_callback(
"|([a-zа-я\d!]{35,})|i",
"split_text",
$postbody);
// Предотвращаем XSS-инъекции
$postbody = htmlspecialchars($postbody, ENT_QUOTES);
// Тэги
$pattern = "#\[b\](.+)\[\/b\]#isU";
$postbody = preg_replace($pattern,
'<b>\\1</b>',
$postbody);
$pattern = "#\[i\](.+)\[\/i\]#isU";
$postbody = preg_replace($pattern,
'<i>\\1</i>',
$postbody);
$pattern = "#\[u\](.+)\[\/u\]#isU";
$postbody = preg_replace($pattern,
'<u>\\1</u>',
$postbody);
$pattern = "#\[sup\](.+)\[\/sup\]#isU";
$postbody = preg_replace($pattern,
'<sup>\\1</sup>',
$postbody);
$pattern = "#\[sub\](.+)\[\/sub\]#isU";
$postbody = preg_replace($pattern,
'<sub>\\1</sub>',
$postbody);
$pattern = "#\[url\][\s]*([\S]*)[\s]*\[\/url\]#si";
$postbody = preg_replace_callback($pattern,
"url_replace",
$postbody);
$pattern = "#\[url[\s]*=[\s]*([\S]+)[\s]*\][\s]*([^\[]*)\[/url\]#isU";
$postbody = preg_replace_callback($pattern,
"url_replace_name",
$postbody);
return $postbody;
}
function url_replace($matches)
{
if(substr($matches[1], 0, 7) != "http://") $matches[1] = "http://".$matches[1];
return "<a href='$matches[1]' class=news_txt_lnk>$matches[1]</a>";
}
function url_replace_name($matches)
{
if(substr($matches[1], 0, 7) != "http://") $matches[1] = "http://".$matches[1];
return "<a href='$matches[1]' class=news_txt_lnk>$matches[2]</a>";
}
function split_text($matches)
{
return wordwrap($matches[1], 35, ' ',1);
}
?>
|
Моя версия:
<?php
function BBCode($string)
{
$string = htmlspecialchars($string, ENT_QUOTES);
$tags = array("b", "i", "u", "sup", "sub", "url");
foreach($tags as $tag)
{
$string = preg_replace("/\[".$tag."\](.*)\[\/".$tag."\]/isU", "<".$tag.">$1</".$tag.">", $string);
$string = preg_replace("/\[url=(.*)\](.*)\[\/url\]/isU", "<a href=\"$1\">$2</a>", $string);
}
return $string;
}
?>
|
Пример использования:
$string = "tag btag i[u]tag u[/u]tag suptag subindex.html";
print BBCode2($string);
|
Судите сами )) | |
|
|
|
|
|
|
|
для: freeing
(18.01.2010 в 00:17)
| | А давайте, только рады будем, тем более давно нужно прикрутить кнопки для соответствующих bbCode.
Только пример посложнее нужно подобрать (т.е. тэг [url][/url] и обработку отсутствия http - иначе ссылки без него будут вести на наш же сайт)
<?php
$string = "[url ]http://www.softtime.org[/url]tag btag i[u]tag u[/u]tag suptag sub[ url=www.example.com/index.html]index.html[/url]";
?>
|
Кроме того, неплохо бы вернуть обратно разбивку длинных строк на части
ффффффффффффффффффффффффффффффффффф ффффффффффффффффффффффффффффффффффф ффффффффффффффффффффффффффффффффффф ффффффффффффффффффффффффффффффффффф ффффффффффффффффффффффффффффффффффф ффффффффффффффффффффффффффффффффффф ффффффффффф
PS Пробелы в тэгах [url] нужно убрать | |
|
|
|
|
|
|
|
для: cheops
(18.01.2010 в 00:29)
| | насчет http и пробелов, согласен,
а насчет длинных срок, не совсем понимаю зачем это нужно,
разве что перенос тегом br сделать,
а то уже достали широкие листинги
думаю стоит сделать двойной редактор,
простой, как был (ну может пару тегов добавить)
и расширенный с возможностью добавления списков, позиционировамием текста, и добавления изображений не как вложение а в тело документа.... | |
|
|
|
|
|
|
|
для: freeing
(18.01.2010 в 10:23)
| | Это собственно не для листингов, а для обычного текста - в листингах пробелы вставлять наугад нельзя. | |
|
|
|
|
|
|
|
для: cheops
(18.01.2010 в 12:20)
| | Листинги можно завернуть в overflow-x: auto, чтобы не резать строки. | |
|
|
|
|
|
|
|
для: cheops
(18.01.2010 в 00:29)
| | модификаторы вроде лишние имеются
<?
function print_page($postbody)
{
// Разрезаем слишком длинные слова
$postbody = preg_replace_callback(
'|([a-zа-я\d!]{35,})|i',
'split_text',
$postbody);
// Предотвращаем XSS-инъекции
$postbody = htmlspecialchars($postbody, ENT_QUOTES);
// Тэги
$postbody = preg_replace(
array(
'#\[b\](.+)\[\/b\]#isU',
'#\[i\](.+)\[\/i\]#isU',
'#\[u\](.+)\[\/u\]#isU',
'#\[sup\](.+)\[\/sup\]#isU',
'#\[sub\](.+)\[\/sub\]#isU'),
array(
'<b>\\1</b>',
'<i>\\1</i>',
'<u>\\1</u\>',
'<sup>\\1<sup>',
'<sub>\\1</sub>'),
$postbody);
$postbody = preg_replace_callback(
array(
'#\[url\]\s*(\S*)\s*\[/url\]#i',
'#\[url\s*=\s*(\S+)\s*\]\s*([^\[]*)\[/url\]#i'),
'url_replace',
$postbody);
return $postbody;
}
function url_replace($matches)
{
if(substr($matches[1], 0, 7) != 'http://')
$matches[1] = 'http://'. $matches[1];
return '<a href="'. $matches[1] .'" class="news_txt_lnk">'
. (isset($matches[2])? $matches[2]: $matches[1]) . '</a>';
}
|
насчёт оптимальнее-ли из двух функций делать одну посложнее не уверен | |
|
|
|
|
|
|
|
для: heed
(18.01.2010 в 12:31)
| | нет смысла в нескольких функциях, к не только print_page обращается, зачем вторая! | |
|
|
|
|
|
|
|
для: freeing
(18.01.2010 в 12:34)
| | >>Существует ответ на данное сообщение, редактирование невозможно
, только хотел поисправить \\1 на $1
, т.к. усомнился что будет работать :)
Наверное, можно просто массив на массив заменять, но c добавлением http:// придётся юзать /e
, что ещё хуже | |
|
|
|
|
|
|
|
для: freeing
(18.01.2010 в 12:34)
| | Достаточно сильное утверждение... вообще говоря речь идет о функциях обратного вызова и почему в них нет смысла не понятно - они вообще нигде явно не вызываются - они используются для неявного вызова. А проблема существует - у нас исторически сложилось две формы записи тэга [url][/url], которые используются и по сей день и обрабатывать эти формы необходимо двумя разными методами. | |
|
|
|
|
|
|
|
для: heed
(18.01.2010 в 12:31)
| |
$postbody = preg_replace(
array(
'#\[b\](.+)\[\/b\]#isU',
'#\[i\](.+)\[\/i\]#isU',
'#\[u\](.+)\[\/u\]#isU',
'#\[sup\](.+)\[\/sup\]#isU',
'#\[sub\](.+)\[\/sub\]#isU'),
array(
'<b>\\1</b>',
'<i>\\1</i>',
'<u>\\1</u\>',
'<sup>\\1<sup>',
'<sub>\\1</sub>'),
$postbody);
|
а чем не устраивает:!
$tags = array("b", "i", "u", "sup", "sub", "url");
foreach($tags as $tag)
{
$string = preg_replace("/\[".$tag."\](.*)\[\/".$tag."\]/isU", "<".$tag.">$1</".$tag.">", $string);
}
|
| |
|
|
|
|
|
|
|
для: freeing
(18.01.2010 в 12:36)
| | циклом :) мне так кажется встроенные в функции принимающие массивы циклы чаще работают быстрее
, нужно тестить на скорость выполнения, только с разным колличеством тегов она будет разной. | |
|
|
|
|
|
|
|
для: heed
(18.01.2010 в 12:45)
| | я не думаю что перебирать массив функцией обратного вызова быстрее чем цикл перебора массивов foreach,
все таки мы с массивом работаем ) зачем считать пальцы на калькуляторе ) | |
|
|
|
|
|
|
|
для: freeing
(18.01.2010 в 12:57)
| |
<pre><?
$postbody = str_repeat(
str_replace('<', '[',
' простой текст простой текст простой текст простой текст простой текст <sub] ########### </sub]
простой текст простой текст простой текст простой текст
<u]подчёркнутый текст</u]
<b]жирная цифра 5<sup]5</sup] в жирной степени</b]текст
ещё <i]курсив</i] и <b]<i]жирный курсив</b]</i]
'), 100);
$mt = microtime(true);
#################################################
preg_replace(
array(
'#\[b\](.+)\[\/b\]#isU',
'#\[i\](.+)\[\/i\]#isU',
'#\[u\](.+)\[\/u\]#isU',
'#\[sup\](.+)\[\/sup\]#isU',
'#\[sub\](.+)\[\/sub\]#isU'),
array(
'<b>\\1</b>',
'<i>\\1</i>',
'<u>\\1</u\>',
'<sup>\\1<sup>',
'<sub>\\1</sub>'),
$postbody);
echo ( microtime(true) - $mt) . "\n\n";
$mt = microtime(true);
##############################################
foreach(array("b", "i", "u", "sup", "sub", "url") as $tag)
{
preg_replace('#\['. $tag .'\](.*)\[/'. $tag
.'\]#isU', '<'. $tag .'>$1</'. $tag .'>', $postbody);
}
echo ( microtime(true) - $mt) . "\n\n";
$mt = microtime(true);
?>
|
Примерно то-же самое или хуже если вместо preg_replace_callback() использовать preg_replace() с модификаторами ./e | |
|
|
|
|
|
|
|
для: heed
(18.01.2010 в 13:28)
| | а ты замени
$postbody = str_repeat(
str_replace('<', '[',
' простой текст простой текст простой текст простой текст простой текст <sub] ########### </sub]
простой текст простой текст простой текст простой текст
<u]подчёркнутый текст</u]
<b]жирная цифра 5<sup]5</sup] в жирной степени</b]текст
ещё <i]курсив</i] и <b]<i]жирный курсив</b]</i]
'), 100);
|
на
$postbody = "простой текст простой текст простой текст простой текст простой текст <sub] ########### </sub]
простой текст простой текст простой текст простой текст
<u]подчёркнутый текст</u]
<b]жирная цифра 5<sup]5</sup] в жирной степени</b]текст
ещё <i]курсив</i] и <b]<i]жирный курсив</b]</i]";
|
| |
|
|
|
|
|
|
|
для: freeing
(18.01.2010 в 13:48)
| | у меня то-же самое, только числа становятся менььше 4.3*10-10 | |
|
|
|
|
|
|
|
для: heed
(18.01.2010 в 13:54)
| | у меня
3.69548797607E-5
4.19616699219E-5
|
| |
|
|
|
|
|
|
|
для: freeing
(18.01.2010 в 13:59)
| | это и есть
3.6 *10-5
4.1*10-5
//т.е. с колличестаом нулей после запятой
// upd: с колличеством сдвигов запятой влево
, ппросто я чего-то загнул с 10-10 ,) примерно просто изображал
Обычно правда нужно более точно измерять раз по несколько одно и то-же в одном скрипте
, и условий может быть масса , но заментно всё-равно хотябы так. | |
|
|
|
|
|
|
|
для: cheops
(18.01.2010 в 00:29)
| | >и обработку отсутствия отсутствия http - иначе ссылки без него будут вести на наш же сайт
тут есть два сображения.
Одно "академическое".
Наличие или отсутствие названия протокола никак не влияет на область разрешения ссылки.
Сравните:
<a href="http://command.com"> доступ к индексной странице сайта по протоколу http</a>
<a href="//command.com"> доступ к индексной странице сайта по протоколу
доступа к текущей странице (тоже очевидно, http) </a>
<a href="http:/command.com"> доступ к файлу сайта в корневом каталоге
сайта текущей страницы по протоколу http </a>
<a href="/command.com"> доступ к файлу сайта в корневом каталоге
сайта текущей страницы по протоколу доступа к текущей странице (тоже очевидно, http)</a>
<a href="http:command.com"> доступ к файлу сайта в каталоге текущей страницы по протоколу http </a>
<a href="command.com"> доступ к файлу сайта в каталоге текущей страницы по протоколу
доступа к текущей странице (тоже очевидно, http)</a>
|
Ergo: наличие http не влияет на то, куда идет обращение. Влияет признак адреса хоста //
Другое фактическое.
Относительные ссылки на внутренние ресурсы полезны не менее, чем явные абсолютные.
Они, как минимум, позволяют не дергаться с softtime.ru на www.softtime.ru и не терять при этом связанную с доменом авторизацию. | |
|
|
|
|
|
|
|
для: Trianon
(18.01.2010 в 12:57)
| | некоторые роботы могут обидеться ,) если много внутренних неработающих ссылок
и логи могут вздуться
если только модерировать ещё насчёт этого.
Правда в гугле много страниц с 404й | |
|
|
|
|
|
|
|
для: freeing
(18.01.2010 в 00:17)
| | utils/include.add_message.php
Строки 30-37:
<script>
function disable(id) {
document.getElementById(id).disabled = true;
window.setTimeout('document.getElementById("'+id+'").disabled=false', 2000);
}
</script>
<tr><td><p class="fieldname">Прикрепить:</td><td><input class=input type=file name=attach size=82></td></tr>
<tr><td> </td><td><input class=button type=submit onclick="disable(this.id)" id="send" name=send value=Отправить></td><td></td></tr>
|
Давно пора это сделать. | |
|
|
|
|
|
|
|
для: Саня
(18.01.2010 в 07:07)
| | Это костыль, а не решение.
И если эта штука будет воздействовать не только на "ответить" , но и на "исправить" - она лишь повредит. | |
|
|
|
|
|
|
|
для: Trianon
(18.01.2010 в 08:11)
| | Решается проблема защиты от даблпоста, а не от флудоспама. А на исправление сообщения это вешать не нужно. | |
|
|
|
|
|
|
|
для: Саня
(18.01.2010 в 09:30)
| | Боюсь правда за 2 секунды все равно несколько сообщений будут успевать насобачить. Правда у меня не получилось :))) | |
|
|
|
|
|
|
|
для: Trianon
(18.01.2010 в 08:11)
| | Хм... а чем она повредит? | |
|
|
|
|
|
|
|
для: cheops
(18.01.2010 в 12:26)
| | Я уж не знаю, nginx или какой другой сетевой компонент на сервере периодически перестает пропускать POST-запросы, но факт имеет место быть.
Там где GET спокойно проходит, POST вываливается в таймаут (минута-две, пока браузер не разведет руками "мол, запрос остался без ответа", при том, что параллельные GET спокойно идут).
Единственным средством как-то реплику пропихнуть является кликание по кнопке "отправить".
Понятно, что сейчас в странице "Ответить на сообщение" это чревато дублями.
Но в странице "Исправить сообщение" это свет в окошке.
Когда на сервер нападает такая простуда, я обычно отправляю сообщение из одного символа "точка".
А потом один из дублей исправляю на реальный текст. Повторными кликами.
Конечно по уму дубли откидывать нужно на серверной стороне. Еще до помещения в базу. По хешу в сессии.
Насколько я помню, вариант ловли дублей в свое время предлагал Unkind. | |
|
|
|
|
|
|
|
для: Trianon
(18.01.2010 в 12:40)
| | Да, сейчас поищу его. | |
|
|
|
|
|
|
|
для: cheops
(18.01.2010 в 12:45)
| | ЗАЧЕМ? // Разрезаем слишком длинные слова | |
|
|
|
|
|
|
|
для: freeing
(18.01.2010 в 13:22)
| | потомучто тут пробегают стаи мамонтов ,) и пишут ПРИВЕЕЕЕЕЕЕЕТ!!!!!!! , только ещё длиннее :)
Кроме такого уворота можно только сделать полосы прокрутки в div'ах с сообщениями
, и плюс такие-же там где код | |
|
|
|
|
|
|
|
для: heed
(18.01.2010 в 14:13)
| | а модераторы на что? )))) (ладно, согласен) | |
|
|
|
|
|
|
|
для: freeing
(18.01.2010 в 13:22)
| | Чтобы избежать вот этого. | |
|
|
|