Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: LiteForum
 
 автор: freeing   (18.01.2010 в 00:17)   письмо автору
 
 

Давайте сделаем 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($postbodyENT_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], 07) != "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], 07) != "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($stringENT_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);



Судите сами ))

  Ответить  
 
 автор: cheops   (18.01.2010 в 00:29)   письмо автору
 
   для: 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] нужно убрать

  Ответить  
 
 автор: freeing   (18.01.2010 в 10:23)   письмо автору
 
   для: cheops   (18.01.2010 в 00:29)
 

насчет http и пробелов, согласен,

а насчет длинных срок, не совсем понимаю зачем это нужно,
разве что перенос тегом br сделать,
а то уже достали широкие листинги

думаю стоит сделать двойной редактор,

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

  Ответить  
 
 автор: cheops   (18.01.2010 в 12:20)   письмо автору
 
   для: freeing   (18.01.2010 в 10:23)
 

Это собственно не для листингов, а для обычного текста - в листингах пробелы вставлять наугад нельзя.

  Ответить  
 
 автор: Саня   (18.01.2010 в 12:32)   письмо автору
 
   для: cheops   (18.01.2010 в 12:20)
 

Листинги можно завернуть в overflow-x: auto, чтобы не резать строки.

  Ответить  
 
 автор: heed   (18.01.2010 в 12:31)   письмо автору
 
   для: 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($postbodyENT_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], 07) != 'http://')
            
$matches[1] = 'http://'$matches[1];
    return 
'<a href="'$matches[1] .'" class="news_txt_lnk">'
     
. (isset($matches[2])? $matches[2]: $matches[1]) . '</a>'
  }

насчёт оптимальнее-ли из двух функций делать одну посложнее не уверен

  Ответить  
 
 автор: freeing   (18.01.2010 в 12:34)   письмо автору
 
   для: heed   (18.01.2010 в 12:31)
 

нет смысла в нескольких функциях, к не только print_page обращается, зачем вторая!

  Ответить  
 
 автор: heed   (18.01.2010 в 12:40)   письмо автору
 
   для: freeing   (18.01.2010 в 12:34)
 

>>Существует ответ на данное сообщение, редактирование невозможно

, только хотел поисправить \\1 на $1
, т.к. усомнился что будет работать :)

Наверное, можно просто массив на массив заменять, но c добавлением http:// придётся юзать /e
, что ещё хуже

  Ответить  
 
 автор: cheops   (18.01.2010 в 12:43)   письмо автору
 
   для: freeing   (18.01.2010 в 12:34)
 

Достаточно сильное утверждение... вообще говоря речь идет о функциях обратного вызова и почему в них нет смысла не понятно - они вообще нигде явно не вызываются - они используются для неявного вызова. А проблема существует - у нас исторически сложилось две формы записи тэга [url][/url], которые используются и по сей день и обрабатывать эти формы необходимо двумя разными методами.

  Ответить  
 
 автор: freeing   (18.01.2010 в 12:36)   письмо автору
 
   для: 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); 
}

  Ответить  
 
 автор: heed   (18.01.2010 в 12:45)   письмо автору
 
   для: freeing   (18.01.2010 в 12:36)
 

циклом :) мне так кажется встроенные в функции принимающие массивы циклы чаще работают быстрее

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

  Ответить  
 
 автор: freeing   (18.01.2010 в 12:57)   письмо автору
 
   для: heed   (18.01.2010 в 12:45)
 

я не думаю что перебирать массив функцией обратного вызова быстрее чем цикл перебора массивов foreach,

все таки мы с массивом работаем ) зачем считать пальцы на калькуляторе )

  Ответить  
 
 автор: heed   (18.01.2010 в 13:28)   письмо автору
 
   для: 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

  Ответить  
 
 автор: freeing   (18.01.2010 в 13:48)   письмо автору
 
   для: 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]";

  Ответить  
 
 автор: heed   (18.01.2010 в 13:54)   письмо автору
 
   для: freeing   (18.01.2010 в 13:48)
 

у меня то-же самое, только числа становятся менььше 4.3*10-10

  Ответить  
 
 автор: freeing   (18.01.2010 в 13:59)   письмо автору
 
   для: heed   (18.01.2010 в 13:54)
 

у меня


3.69548797607E-5
4.19616699219E-5

  Ответить  
 
 автор: heed   (18.01.2010 в 15:04)   письмо автору
 
   для: freeing   (18.01.2010 в 13:59)
 

это и есть
3.6 *10-5
4.1*10-5
//т.е. с колличестаом нулей после запятой
// upd: с колличеством сдвигов запятой влево

, ппросто я чего-то загнул с 10-10 ,) примерно просто изображал

Обычно правда нужно более точно измерять раз по несколько одно и то-же в одном скрипте
, и условий может быть масса , но заментно всё-равно хотябы так.

  Ответить  
 
 автор: Trianon   (18.01.2010 в 12:57)   письмо автору
 
   для: 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 и не терять при этом связанную с доменом авторизацию.

  Ответить  
 
 автор: heed   (18.01.2010 в 15:28)   письмо автору
 
   для: Trianon   (18.01.2010 в 12:57)
 

некоторые роботы могут обидеться ,) если много внутренних неработающих ссылок
и логи могут вздуться

если только модерировать ещё насчёт этого.
Правда в гугле много страниц с 404й

  Ответить  
 
 автор: Саня   (18.01.2010 в 07:07)   письмо автору
 
   для: 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>&nbsp;</td><td><input class=button type=submit onclick="disable(this.id)" id="send" name=send value=Отправить></td><td></td></tr>

Давно пора это сделать.

  Ответить  
 
 автор: Trianon   (18.01.2010 в 08:11)   письмо автору
 
   для: Саня   (18.01.2010 в 07:07)
 

Это костыль, а не решение.
И если эта штука будет воздействовать не только на "ответить" , но и на "исправить" - она лишь повредит.

  Ответить  
 
 автор: Саня   (18.01.2010 в 09:30)   письмо автору
 
   для: Trianon   (18.01.2010 в 08:11)
 

Решается проблема защиты от даблпоста, а не от флудоспама. А на исправление сообщения это вешать не нужно.

  Ответить  
 
 автор: cheops   (18.01.2010 в 12:27)   письмо автору
 
   для: Саня   (18.01.2010 в 09:30)
 

Боюсь правда за 2 секунды все равно несколько сообщений будут успевать насобачить. Правда у меня не получилось :)))

  Ответить  
 
 автор: cheops   (18.01.2010 в 12:26)   письмо автору
 
   для: Trianon   (18.01.2010 в 08:11)
 

Хм... а чем она повредит?

  Ответить  
 
 автор: Trianon   (18.01.2010 в 12:40)   письмо автору
 
   для: cheops   (18.01.2010 в 12:26)
 

Я уж не знаю, nginx или какой другой сетевой компонент на сервере периодически перестает пропускать POST-запросы, но факт имеет место быть.
Там где GET спокойно проходит, POST вываливается в таймаут (минута-две, пока браузер не разведет руками "мол, запрос остался без ответа", при том, что параллельные GET спокойно идут).
Единственным средством как-то реплику пропихнуть является кликание по кнопке "отправить".
Понятно, что сейчас в странице "Ответить на сообщение" это чревато дублями.
Но в странице "Исправить сообщение" это свет в окошке.

Когда на сервер нападает такая простуда, я обычно отправляю сообщение из одного символа "точка".
А потом один из дублей исправляю на реальный текст. Повторными кликами.

Конечно по уму дубли откидывать нужно на серверной стороне. Еще до помещения в базу. По хешу в сессии.
Насколько я помню, вариант ловли дублей в свое время предлагал Unkind.

  Ответить  
 
 автор: cheops   (18.01.2010 в 12:45)   письмо автору
 
   для: Trianon   (18.01.2010 в 12:40)
 

Да, сейчас поищу его.

  Ответить  
 
 автор: freeing   (18.01.2010 в 13:22)   письмо автору
 
   для: cheops   (18.01.2010 в 12:45)
 

ЗАЧЕМ? // Разрезаем слишком длинные слова

  Ответить  
 
 автор: heed   (18.01.2010 в 14:13)   письмо автору
 
   для: freeing   (18.01.2010 в 13:22)
 

потомучто тут пробегают стаи мамонтов ,) и пишут ПРИВЕЕЕЕЕЕЕЕТ!!!!!!! , только ещё длиннее :)

Кроме такого уворота можно только сделать полосы прокрутки в div'ах с сообщениями
, и плюс такие-же там где код

  Ответить  
 
 автор: freeing   (18.01.2010 в 14:58)   письмо автору
 
   для: heed   (18.01.2010 в 14:13)
 

а модераторы на что? )))) (ладно, согласен)

  Ответить  
 
 автор: Саня   (18.01.2010 в 14:18)   письмо автору
 
   для: freeing   (18.01.2010 в 13:22)
 

Чтобы избежать вот этого.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования