Autor Tópico: [TUTORIAL] Usar BBCode em php  (Lida 5111 vezes)

Offline HolyMurderer

  • Aprendiz
  • **
  • Mensagens: 132
    • Ver Perfil
[TUTORIAL] Usar BBCode em php
« em: 23 de Março de 2006, 13:51:17 »
Boas!

Tenho uma dúvida!

Tenho um texto numa BD MySQL, em VARCHAR, que contém algumas palavras começadas por http://, ou por www, ou parecido.

Já programei o php para mostrar o conteúdo e tudo aparece bem. O que agora queria fazer era algo tipo os foruns, ou seja, se os links tiverem http:// e mostrar em link em vez de texto, ou e mostrar a imagem mesmo.

Alguém sabe como isto é possível?

Obrigado :)

Offline Grettir

  • Aprendiz
  • **
  • Mensagens: 284
    • Ver Perfil
[TUTORIAL] Usar BBCode em php
« Responder #1 em: 23 de Março de 2006, 14:07:53 »
Nao tenho a certeza de como os foruns processam isso, mas das duas uma...

- Ou reconhecem a inserçao da tag no nome do ficheiro

- ou processam a tag no servidor

(acredito mais que seja a primeira forma)
----------------------------------
Ricardo Castelhano aka Grettir

Adobe Certified Professional
Interactive Designer
Flash Developer
PHP Developer

http://www.ricardocastelhano.com/
-----------------------------------
Keep on "Flashing..."

Offline gimbras

  • Emblema de Prata
  • ****
  • Mensagens: 1105
    • Ver Perfil
    • NoFuturo.com
[TUTORIAL] Usar BBCode em php
« Responder #2 em: 23 de Março de 2006, 19:14:55 »
Essas TAGS são BBCode. Temos cá um membro o xôr Spread que tem um site que usa esse código.

Oh Spread explica aí como se faz, s.f.f.

Offline Spread

  • Aprendiz
  • **
  • Mensagens: 189
    • Ver Perfil
    • Spread
[TUTORIAL] Usar BBCode em php
« Responder #3 em: 23 de Março de 2006, 21:11:27 »
Para conseguires utilizar isso basta-te fazeres um include de um ficheiro bbcode.php e usares a função BBCode(argumento);
Exemplo:
$tituloa = BBCode($titulo); (ele pega no que tá no titulo passa-lhe o bbcode e guarda o código em tituloa).

O bbcode desactiva os comandos html (para maior segurança, evitando as sql injects).

Eu vou procurar o ficheiro bbcode.php inalterado (que eu no meu modifiquei-o e tirei várias funções). Caso precises podes optimzar os códigos ;)

Cumps 8)

Offline HolyMurderer

  • Aprendiz
  • **
  • Mensagens: 132
    • Ver Perfil
[TUTORIAL] Usar BBCode em php
« Responder #4 em: 23 de Março de 2006, 23:11:34 »
Obrigadão Spread :D

Quando tiveres isso avisa ;)

Também poderei fazer algo tipo $titulo = $BBCode(titulo); ou sou obrigado a usar uma nova variável?

Outra coisa, ele só faz BBCode ao que começar por [url] e [img] e isso, certo?

Offline Spread

  • Aprendiz
  • **
  • Mensagens: 189
    • Ver Perfil
    • Spread
[TUTORIAL] Usar BBCode em php
« Responder #5 em: 23 de Março de 2006, 23:26:01 »
Põe este código no bloco de notas e grava como bbcode.php .

<? php

//START 3rd PARTY CODE:  I did not write this
/************************************************/
/*              BBCode v1.0a                    */
/*              Date: 03/2003                   */
/*                                              */
/*      A simple and effective script that      */
/*      allows you to implement bbcode type     */
/*      behaviour on your php website.          */
/*                                              */
/*      Contact: bbcode@netgem.freeserve.co.uk  */
/*                                              */
/*      Usage:                                  */
/*                                              */
/*      Put the following line at the top of    */
/*      the page you want to have the bbocde    */
/*      in...(assumes both pages are in the     */
/*      folder                                  */
/*                                              */
/*      include("bbCode.php");                  */
/*                                              */
/*      Pass the text to the function:          */
/*                                              */
/*      $mytext = BBCode("This is my BBCODE");  */
/*      or                                      */
/*      $mytext = "This is my text";            */
/*      $mytext = BBCode($mytext);              */
/*                                              */
/*      echo $mytext;                           */
/*                                              */
/************************************************/
?>
<style type="text/css">
<!--
body    {
        font-family: Verdana, Arial, Helvetica, sans-serif;
    font-size: 12px;
}

.bold {
        font-weight: bold;
}

.italics {
        font-style: italic;
}

.underline {
        text-decoration: underline;
}

.strikethrough {
        text-decoration: line-through;
}

.overline {
        text-decoration: overline;
}

.sized {
        text-size:
}

.quotecodeheader {
        font-family: Verdana, arial, helvetica, sans-serif;
        font-size: 12px;
        font-weight: bold;
}

.codebody {
        background-color: #FFFFFF;
    font-family: Courier new, courier, mono;
    font-size: 12px;
    color: #006600;
    border: 1px solid #BFBFBF;
}

.quotebody {
        background-color: #FFFFFF;
    font-family: Courier new, courier, mono;
    font-size: 12px;
    color: #660002;
        border: 1px solid #BFBFBF;
}

.listbullet {
        list-style-type: disc;
        list-style-position: inside;
}

.listdecimal {
        list-style-type: decimal;
        list-style-position: inside;
}

.listlowerroman {
        list-style-type: lower-roman;
        list-style-position: inside;
}

.listupperroman {
        list-style-type: upper-roman;
        list-style-position: inside;
}

.listloweralpha {
        list-style-type: lower-alpha;
        list-style-position: inside;
}

.listupperalpha {
        list-style-type: upper-alpha;
        list-style-position: inside;
}
-->
</style>

<?php
        //Local copy

        function BBCode($Text)
            {
                // Replace any html brackets with HTML Entities to prevent executing HTML or script
            // Don't use strip_tags here because it breaks [url] search by replacing & with amp
            $Text = str_replace("<", "&lt;", $Text);
            $Text = str_replace(">", "&gt;", $Text);



            // Set up the parameters for a URL search string
            $URLSearchString = " a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'";
            // Set up the parameters for a MAIL search string
            $MAILSearchString = $URLSearchString . " a-zA-Z0-9\.@";

                        //Non BB URL Search
                        //$Text = eregi_replace("([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])", "<a href=\"\\1://\\2\\3\" target=\"_blank\" target=\"_new\">\\1://\\2\\3</a>", $Text);
                //$Text = eregi_replace("(([a-z0-9_]|\\-|\\.)+@([^[:space:]]*)([[:alnum:]-]))", "<a href=\"mailto:\\1\" target=\"_new\">\\1</a>", $Text);
                if (substr($Text,0, 7) == "http://"){
            $Text = eregi_replace("([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])", "<a href=\"\\1://\\2\\3\">\\1://\\2\\3</a>", $Text);
                 // Convert new line chars to html <br /> tags
            $Text = nl2br($Text);
                        } else {
            // Perform URL Search
            $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/", '<a href="javascript:go(\'$1\',\'new\')">$1</a>', $Text);
            $Text = preg_replace("(\[url\=([$URLSearchString]*)\](.+?)\[/url\])", '<a href="javascript:go(\'$1\',\'new\')">$2</a>', $Text);
                        //$Text = preg_replace("(\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[/url\])", '<a href="$1" target="_blank">$2</a>', $Text);
                         // Convert new line chars to html <br /> tags
            $Text = nl2br($Text);
                        }
            // Perform MAIL Search
            $Text = preg_replace("(\[mail\]([$MAILSearchString]*)\[/mail\])", '<a href="mailto:$1">$1</a>', $Text);
            $Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.+?)\[\/mail\]/", '<a href="mailto:$1">$2</a>', $Text);

            // Check for bold text
            $Text = preg_replace("(\[b\](.+?)\[\/b])is",'<span class="bold">$1</span>',$Text);

            // Check for Italics text
            $Text = preg_replace("(\[i\](.+?)\[\/i\])is",'<span class="italics">$1</span>',$Text);

            // Check for Underline text
            $Text = preg_replace("(\[u\](.+?)\[\/u\])is",'<span class="underline">$1</span>',$Text);

            // Check for strike-through text
            $Text = preg_replace("(\[s\](.+?)\[\/s\])is",'<span class="strikethrough">$1</span>',$Text);

            // Check for over-line text
            $Text = preg_replace("(\[o\](.+?)\[\/o\])is",'<span class="overline">$1</span>',$Text);

            // Check for colored text
            $Text = preg_replace("(\[color=(.+?)\](.+?)\[\/color\])is","<span style=\"color: $1\">$2</span>",$Text);

            // Check for sized text
            $Text = preg_replace("(\[size=(.+?)\](.+?)\[\/size\])is","<span style=\"font-size: $1px\">$2</span>",$Text);

            // Check for list text
            $Text = preg_replace("/\[list\](.+?)\[\/list\]/is", '<ul class="listbullet">$1</ul>' ,$Text);
            $Text = preg_replace("/\[list=1\](.+?)\[\/list\]/is", '<ul class="listdecimal">$1</ul>' ,$Text);
            $Text = preg_replace("/\[list=i\](.+?)\[\/list\]/s", '<ul class="listlowerroman">$1</ul>' ,$Text);
            $Text = preg_replace("/\[list=I\](.+?)\[\/list\]/s", '<ul class="listupperroman">$1</ul>' ,$Text);
            $Text = preg_replace("/\[list=a\](.+?)\[\/list\]/s", '<ul class="listloweralpha">$1</ul>' ,$Text);
            $Text = preg_replace("/\[list=A\](.+?)\[\/list\]/s", '<ul class="listupperalpha">$1</ul>' ,$Text);
            $Text = str_replace("
  • ", "<li>", $Text);


            // Check for font change text
            $Text = preg_replace("(\[font=(.+?)\](.+?)\[\/font\])","<span style=\"font-family: $1;\">$2</span>",$Text);

            // Declare the format for [code] layout
            $CodeLayout = '<table width="90%" border="0" align="center" cellpadding="0" cellspacing="0">
                                <tr>
                                    <td class="quotecodeheader"> Code:</td>
                                </tr>
                                <tr>
                                    <td class="codebody">$1</td>
                                </tr>
                           </table>';
            // Check for [code] text
            $Text = preg_replace("/\[code\](.+?)\[\/code\]/is","$CodeLayout", $Text);

            // Declare the format for
Citar
layout
            $QuoteLayout = '<table width="90%" border="0" align="center" cellpadding="0" cellspacing="0">
                                <tr>
                                    <td class="quotecodeheader"> Quote:</td>
                                </tr>
                                <tr>
                                    <td class="quotebody">$1</td>
                                </tr>
                           </table>';

            // Check for [code] text
            $Text = preg_replace("/\[quote\](.+?)\[\/quote\]/is","$QuoteLayout", $Text);

            // Images
            //
            $Text = preg_replace("/\[img\](.+?)\[\/img\]/", '<img src="$1">', $Text);

            // [img=widthxheight]image source[/img]
            $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.+?)\[\/img\]/", '<img src="$3" height="$2" width="$1">', $Text);

                return $Text;
                }


//END 3rd PARTY CODE
?>

Eu no meu desactivei algumas funções (como o http e o www pois esta a dar-me problemas) inserindo  // antes de cada linha (ou seja transformando essas linhas de código em comentários). Quanto à questão que fizes-te eu tentei fazer também o update à variável mas não funcionou, e na altura o mais fácil para mim foi fazer 2 variáveis. Se conseguires implentar assim avisa que eu agradeço.

Cumps 8)

Offline HolyMurderer

  • Aprendiz
  • **
  • Mensagens: 132
    • Ver Perfil
[TUTORIAL] Usar BBCode em php
« Responder #6 em: 23 de Março de 2006, 23:48:02 »
Obrigadão :D :D

Já fiz umas mudanças ao ficheiro :)

Não curti que ele abrisse a janela em new window por javascript, pois alguns browsers (como o maravilhoso firefox) bloqueiam isso, como tal, alterei as linhas 145 e 146 para:

$Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/", '<a href="$1" target="_blank">$1</a>', $Text);
$Text = preg_replace("(\[url\=([$URLSearchString]*)\](.+?)\[/url\])", '<a href="$1" target="_blank">$2</a>', $Text);

Ainda estou a avaliar mais linhas ;) mas já bomba com o [url] e tal :D

Offline gimbras

  • Emblema de Prata
  • ****
  • Mensagens: 1105
    • Ver Perfil
    • NoFuturo.com
[TUTORIAL] Usar BBCode em php
« Responder #7 em: 24 de Março de 2006, 17:05:13 »
Ei, fixe! Muda só o título do tópico para BBcode, assim toda a gente saberá usá-lo.

Offline HolyMurderer

  • Aprendiz
  • **
  • Mensagens: 132
    • Ver Perfil
[TUTORIAL] Usar BBCode em php
« Responder #8 em: 24 de Março de 2006, 23:42:01 »
Tá melhor assim? :)

Caso melhorem ou alterem o script em algo, sff postem aqui a alteração, como eu fiz :)

Offline gimbras

  • Emblema de Prata
  • ****
  • Mensagens: 1105
    • Ver Perfil
    • NoFuturo.com
[TUTORIAL] Usar BBCode em php
« Responder #9 em: 25 de Março de 2006, 00:33:50 »
Nice, ficou fixe.

Offline HolyMurderer

  • Aprendiz
  • **
  • Mensagens: 132
    • Ver Perfil
[TUTORIAL] Usar BBCode em php
« Responder #10 em: 1 de Abril de 2006, 14:35:19 »
Tive uma ideia, que talvez me possam ajudar. E que tal acrescentar uma função ao ficheiro php, que é quando adicionarmos imagens, com o img, acrescentar-se algo em que se possa definir os pixels em que queremos a imagem?

Isso por acaso está-me a dar jeito, e calculei que desse mais jeito a mais pessoas :)

Offline gimbras

  • Emblema de Prata
  • ****
  • Mensagens: 1105
    • Ver Perfil
    • NoFuturo.com
[TUTORIAL] Usar BBCode em php
« Responder #11 em: 1 de Abril de 2006, 23:52:41 »
Acho que isso é possível. Pelo menos, para o BBcode do phpBB existe 1 MOD desse tipo. Eu não sei é como isso se faz.

Offline HolyMurderer

  • Aprendiz
  • **
  • Mensagens: 132
    • Ver Perfil
[TUTORIAL] Usar BBCode em php
« Responder #12 em: 4 de Abril de 2006, 10:21:53 »
Esqueçam... se lerem bem o proprio script já referido em cima, está lá incluido como fazer isso... o proprio bbcode permite isso.

É só fazer
Código: [Seleccione]
[img=200x100]a.gif[/img] por exemplo ;)

 




Roleta das Anedotas - Abre noutra janela