Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> регулярные выражения bbcode, Проблема определении цвета. 
V
    Опции темы
woin
Дата 2.5.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Есть функция обрабатывающая bbcode. В принципе работает нормально, но вот с цветами глючит.
 заменяет один цвет на другой, "именной" на код и притом неверный. Да кроме того если цветов несколько со сдвигом.
 в хотя по логике(насколько я могу судить) всё верно.

Как исправить чтобы обрабатывалось корректно. и из-за чего происходит замена цвета?  smile 

пример обрабатываемого текста:
Код

[size=16] Melat: Я позитивист. Оттого мне вкусно жить! [/size]


[color=darkred][i]Наша встреча с королевой Демонов носила полуофициальный характер,  к тому же собеседник оказался интересным, на вопросы отвечала тут же и вполне искренне. Поэтому сырого материала получилось много и мне пришлось отшлифовывать. Оставил то, что представляет интерес, включая и некоторые «лирические отступления», чтобы не исказить образ.  Впрочем, вот что из всего этого получилось: [/i][/color]

Drakosha 
для  начала - как звучит официально Ваш титул?)

Melat 
[color=darkblue]предпочитаю банальный титул - Глава клана. Однако на Королеву и Люцифера тоже отзываюсь.))) [/color]

Drakosha 
вот вот...)) к тому же мы, журналюги, народ пытливого ума. Порывшись в первоисточниках, например тут:  http://almanac.talevision.com.ua/poems/chombi/chombi9a.html в глаза бросилось "грозная Мелат"... неужто и взаправду такая, на первый взгляд, обаятельная девушка может быть «грозной»?:)


после обработки:
Код


<font style="" 16pt\=""> Melat: Я позитивист. Оттого мне вкусно жить! </font></strong><br>
<br>
<br>
<font color="#0000d0"><em><strong>Наша встреча с королевой Демонов носила полуофициальный характер,  к тому же собеседник оказался интересным, на
вопросы отвечала тут же и вполне искренне. Поэтому сырого материала получилось много и мне пришлось отшлифовывать. Оставил то, что представляет
интерес, включая и некоторые «лирические отступления», чтобы не исказить образ.  Впрочем, вот что из всего этого получилось: </strong></em>[/color]<br>
<br>
<strong>Drakosha</strong> <br>
для  начала - как звучит официально Ваш титул?)<br>
<br>
<strong>Melat</strong> <br>

<font color="#00000e">предпочитаю банальный титул - Глава клана. Однако на Королеву и Люцифера тоже отзываюсь.))) [/color]<br>
<br>
<strong>Drakosha</strong> <br>
вот вот...)) к тому же мы, журналюги, народ пытливого ума. Порывшись в первоисточниках, например тут:  <a href="http://almanac.talevision.com.ua/poems/chombi/chombi9a.html" target="\&quot;_blank\&quot;">http://almanac.talevision.com.ua/poems/chombi/chombi9a.html</a> в
глаза бросилось "грозная Мелат"... неужто и взаправду такая, на первый взгляд, обаятельная девушка может быть «грозной»?:)<br>








Код

function postify($message, $smileyoff='no', $bbcodeoff='no', $allowsmilies='yes', $allowhtml='yes', $allowbbcode='yes', $allowimgcode='yes', $ignorespaces=false, $ismood="no", $wrap="yes") {
    global $imgdir, $bordercolor, $table_words, $table_forums, $table_smilies, $db, $smdir, $smiliecache, $censorcache, $smiliesnum, $wordsnum, $versionbuild, $lang, $fontsize;

//    $message = checkOutput($message, $allowhtml, '', true);

//    $message = censor($message, $ignorespaces);

    $bballow = ($allowbbcode == 'yes' || $allowbbcode == 'on') ? (($bbcodeoff != 'off' && $bbcodeoff != 'yes') ? true : false) : false;
    $smiliesallow = ($allowsmilies == 'yes' || $allowsmilies == 'on') ? (($smileyoff != 'off' && $smileyoff != 'yes') ? true : false) : false;
        $message = preg_replace( '/\[size=(.*)\]/iU','<font style="font-size: $1pt">',$message);
        $message = str_replace("[/size]","</font>",$message);
        $message = preg_replace( '/\[url=http:\/\/(.*)\](.*)\[\/url\]/iU', '<a href=http://$1>$2</a>',$message);
        $message = preg_replace( '/\[url=(.*)\](.*)\[\/url\]/iU', '<a href=http://$1>$2</a>',$message);
        $message = preg_replace( '/\[url\]http:\/\/(.*)\[\/url\]/iU', '<a href=http://$1>$1</a>',$message);
        $message = preg_replace( '/\[url\](.*)\[\/url\]/iU', '<a href=http://$1>$1</a>',$message);
        $message = preg_replace( '/\[color=(.*)\]/iU','<font color="$1">',$message);

    if ( $bballow) {
        $message = stripslashes($message);

        if ( $ismood == "yes") {
            $message = str_replace(array('[poem]', '[/poem]', '[quote]', '[/quote]', '
Код
', '
', '[list]', '[/list]', '[list=1]', '[list=a]', '[list=A]', '[/list=1]', '[/list=a]', '[/list=A]'), '[center]', '[/center]', '', $message);
        }

        $begin = array(
                0    => '',
                1    => '[i]',
                2    => '[u]',
                3    => '[poem]',
                4    => '[marquee]',
                5    => '[blink]',
                6    => '[strike]',
                7    => '[quote]',
                8    => '
Код
',
                9    => '[list]',
                10    => '[list=1]',
                11    => '[list=a]',
                12    => '[list=A]',
                13    => '[center]'
                );

        $end = array(
                0    => '[/b]',
                1    => '[/i]',
                2    => '[/u]',
                3    => '[/poem]',
                4    => '[/marquee]',
                5    => '[/blink]',
                6    => '[/strike]',
                7    => '[/quote]',
                8    => '
',
                9    => '[/list]',
                10    => '[/list=1]',
                11    => '[/list=a]',
                12    => '[/list=A]',
                13    => '[/center]'
                );

        foreach ($begin as $key=>$value) {
            $check = substr_count($message, $value) - substr_count($message, $end[$key]);
            if ( $check > 0) {
                $message = $message.str_repeat($end[$key], $check);
            }elseif ( $check < 0) {
                $message = str_repeat($value, abs($check)).$message;
            }
        }

        $find = array(
                0   => '[b]',
                1   => '
',
                2   => '[i]',
                3   => '[/i]',
                4   => '[poem]',
                5   => '[/poem]',
                6   => '[u]',
                7   => '[/u]',
                8   => '[marquee]',
                9   => '[/marquee]',
                10  => '[blink]',
                11  => '[/blink]',
                12  => '[strike]',
                13  => '[/strike]',
                14  => '[vinfo]',
                15  => '[quote]',
                16  => '[/quote]',
                17  => '
Код
',
                18  => '
',
                19  => '[list]',
                20  => '[/list]',
                21  => '[list=1]',
                22  => '[list=a]',
                23  => '[list=A]',
                24  => '[/list=1]',
                25  => '[/list=a]',
                26  => '[/list=A]',
                27  => '[credits]',
                28  => '[*]',
                29  => '[buildedition]',
                30  => '<br />',
                31  => '[center]',
                32  => '[/center]'
                );

        $replace = array(
                0   => '<strong>',
                1   => '</strong>',
                2   => '<em>',
                3   => '</em>',
                4   => '<div align=\"center\"><em>',
                5   => '</div></em>',
                6   => '<u>',
                7   => '</u>',
                8   => '<marquee>',
                9   => '</marquee>',
                10  => '<blink>',
                11  => '</blink>',
                12  => '<strike>',
                13  => '</strike>',
                14  => '<strong>'.strrev('suxeN - 1.9.1 BMX').'</strong>',
                15  => "</font><table align=\"center\" class=\"quote\" cellspacing=\"0\" cellpadding=\"0\"><tr><td class=\"quote\">$lang[textquote]</td></tr><tr><td class=\"quotemessage\">",
                16  => "</td></tr></table><font class=\"mediumtxt\">",
                17  => "</font><table align=\"center\" class=\"code\" cellspacing=\"0\" cellpadding=\"0\"><tr><td class=\"code\">$lang[textcode]</td></tr><tr><td class=\"codemessage\">",
                18  => "</td></tr></table><font class=\"mediumtxt\">",
                19  => '<ul type="square">',
                20  => '</ul>',
                21  => '<ol type="1">',
                22  => '<ol type="A">',
                23  => '<ol type="A">',
                24  => '</ol>',
                25  => '</ol>',
                26  => '</ol>',
                27  => 'XMB 1.9.1 Main Developers - Tularis, vanderaj, Richard, RevMac, Daf, Ixan, John Briggs. For More Information On Other Staff - Visit xmbforum.com',
                28  => '<li />',
                29  => '<strong>Build ID: '.$versionbuild.'</strong>',
                30  => ' <br>',
                31  => '<center>',
                32  => '</center>'
                );

        $message = str_replace($find, $replace, $message);

        if ( $smiliesallow) {
          //  $message = smile($message);
        }

        $patterns = array();
        $replacements = array();


        $patterns[] = "#\[color=([^\"'<>]*?)\](.*?)\[/color\]#Ssi";
        $replacements[] = '<font color="\1">\2</font>';



        $patterns[] = "#\[size=([+-]?[0-9]{1,2})\](.*?)\[/size\]#Ssie";
        $replacements[] = '"<font style=\"font-size: ".createAbsFSizeFromRel(\'$1\').";\">".stripslashes(\'$2\')."</font>"';

        $patterns[] = "#\[font=([a-z\r\n\t 0-9]+)\](.*?)\[/font\]#Ssi";
        $replacements[] = '<font face="\1">\2</font>';

        $patterns[] = "#\[align=([a-z]+)\](.*?)\[/align\]#Ssi";
        $replacements[] = '<p align="\1">\2</p>';

        if ($allowimgcode != 'no' && $allowimgcode != 'off') {

         if (!stristr($message, 'javascript:') && (stristr($message, 'jpg[/img]') || stristr($message, 'jpeg[/img]') || stristr($message, 'gif[/img]') || stristr($message, 'png[/img]') || stristr($message, 'bmp[/img]') || stristr($message, 'php[/img]')))
         {
            $patterns[] = '#\[img\](http[s]?|ftp[s]?){1}://([:a-z\\./_\-0-9%~]+){1}(\?[a-z=_\-0-9&;~]*)?\[/img\]#Smi';
            $replacements[] = '<img src=\1://\2\3 border="0" alt=\1://\2\3/>';    //

            $patterns[] = "#\[img=([0-9]*?){1}x([0-9]*?)\](http[s]?|ftp[s]?){1}://([:~a-z\\./0-9_\-%]+){1}(\?[a-z=0-9&_\-;~]*)?\[/img\]#Smi";
            $replacements[] = '<img width="\1" height="\2" src="\3://\4\5" alt="\3://\4\5" border="0" />';
         }

            $patterns[] = "#\[flash=([0-9]*?){1}x([0-9]*?)\]([^\"'<>]*?)\[/flash\]#Ssi";
            //$replacements[] = '<OBJECT classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 codebase=http://active.macromedia.com/flash2/cabs/swflash.cab#version=6,0,0,0 ID=main WIDTH=\1 HEIGHT=\2><PARAM NAME=movie VALUE=\3><PARAM NAME=loop VALUE=false><PARAM NAME=menu VALUE=false><PARAM NAME=quality VALUE=best><EMBED src=\3 loop=false menu=false quality=best WIDTH=\1 HEIGHT=\2 TYPE=application/x-shockwave-flash PLUGINSPAGE=http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash></EMBED></OBJECT>';
            $replacements[] = '<object type="application/x-shockwave-flash" data="$3" width="$1" height="$2"><param name="movie" value="$3" /></object>';
        }

        //$patterns[] = '#([^\'"=\]]|^)(http[s]?|ftp[s]?|gopher|irc){1}://([:a-z_\-\\./0-9%~]+){1}(\?[a-z=0-9.\-_&;]*)?(\#[a-z0-9._]+)?#Smi';
        $patterns[] = '#([^\'"=\]]|^)(http[s]?|ftp[s]?|gopher|irc){1}://([a-z0-9.]+[a-z0-9])(:[0-9]+)?(/[a-z0-9./~\-_\\%]*)?(\?[a-z=0-9.\-\+_&;]*)?(\#[a-z0-9._]+)?#Smi';
        $replacements[] = '\1<a href=\2://\3\4\5\6\7 target="_blank">\2://\3\4\5\6\7</a>';

        $patterns[] = "#\[url\]([a-z]+?://){1}([^\"'<>]*?)\[/url\]#Smi";
        $replacements[] = '<a href=\1\2 target="_blank">\1\2</a>';

        $patterns[] = "#\[url\]([^\"'<>]*?)\[/url\]#Smi";
        $replacements[] = '<a href="http://\1" target="_blank">\1</a>';

        // Do we need this? yes!
        $patterns[] = "#\[url=([a-z]+?://){1}([^\"'<>]*?)\](.*?)\[/url\]#Smi";
        $replacements[] = '<a href="\1\2" target="_blank">\3</a>';

        $patterns[] = "#\[url=([^\"'<>]*?)\](.*?)\[/url\]#Smi";
        $replacements[] = '<a href="http://\1" target="_blank">\2</a>';

        $patterns[] = "#\[email\]([^\"'<>]*?)\[/email\]#Smi";
        $replacements[] = '<a href="mailto:\1">\1</a>';

        $patterns[] = "#\[email=([^\"'<>]*?){1}([^\"]*?)\](.*?)\[/email\]#Smi";
        $replacements[] = '<a href="mailto:\1\2">\3</a>';

            $message = preg_replace($patterns, $replacements, $message);


        $message = addslashes($message);
    }

    else{
        if ( $smiliesallow) {
           // $message = smile($message);
        }
    }

   
    $message = nl2br($message);
    if ( $wrap == "yes") {
        $message = wordwrap($message, 150, "\n", 1);
        $message = preg_replace('#(\[/?.*)\n(.*\])#mi', '\\1\\2', $message);
    }

    return $message;
}


Это сообщение отредактировал(а) woin - 2.5.2007, 17:47

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  function.php 10,81 Kb
PM MAIL   Вверх
nerezus
Дата 2.5.2007, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



выложи отдельным файлом


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
woin
Дата 2.5.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Цитата(nerezus @  2.5.2007,  17:02 Найти цитируемый пост)
выложи отдельным файлом

выложил  smile 
PM MAIL   Вверх
nerezus
Дата 3.5.2007, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



1) Есть такой тип, как логический. И такие штуки, как true и  false. 
2) 
Код
 echo postify("Его звали Д'Артаньяном"); 
 Ошибка. Лишние слеши.
3) allowhtml всегда on. И нахрен тогда нужен такой парсер?

Добавлено через 3 минуты и 40 секунд
Теперь по коду.

Я бы не стал делать через прогон текста по регуляркам. Слишком ненадежно. Провернено сотни раз на phpBB, IPB, vB и т.д. "знаменитых" продуктах.

Я бы составил State Machine, разделил бы код на атомы, постоил бы дерево, произвел бы escape текста в нужных узлах делева и потом бы бб-коды заменил тегами с нужными параметрами.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
woin
Дата 3.5.2007, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Цитата(nerezus @  3.5.2007,  17:26 Найти цитируемый пост)
Я бы не стал делать через прогон текста по регуляркам. Слишком ненадежно. Провернено сотни раз на phpBB, IPB, vB и т.д. "знаменитых" продуктах.
Я бы составил State Machine, разделил бы код на атомы, постоил бы дерево, произвел бы escape текста в нужных узлах делева и потом бы бб-коды заменил тегами с нужными параметрами.

 
  А есть уже написанные подобные функции?
  smile 

Пробовал  разобраться на примере phpBB - не получилось.  там какая-то многоступенчатая система, нашёл только начало и середину :(

PM MAIL   Вверх
nerezus
Дата 3.5.2007, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



на phpclub.ru форуме вроде в оффтопе тема про ББ-парсер.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Wolf1994
Дата 3.5.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

Репутация: 1
Всего: 29



Кое-что: http://www.wolf-ware.ru/forum/id/436/ - обработка тегов без вложений. Есть скрипт, с обработкой текста с вложенной структурой тэгов. Если интересует, обращайтесь на мой форум.
PM MAIL WWW   Вверх
woin
Дата 3.5.2007, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Цитата(nerezus @  3.5.2007,  18:13 Найти цитируемый пост)
на phpclub.ru форуме вроде в оффтопе тема про ББ-парсер. 

Спасибо! smile   
Немного изменить и будет, то что нужно   smile 

Цитата(Wolf1994 @  3.5.2007,  18:35 Найти цитируемый пост)
Есть скрипт, с обработкой текста с вложенной структурой тэгов. Если интересует, обращайтесь на мой форум. 

Я уже нашёл, то что искал smile    smile 

Тут лежит: http://www.xbb.uz/?part=inf


Это сообщение отредактировал(а) woin - 3.5.2007, 22:33
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.1297 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.