Jump to content

bbcode to xhtml


The Boss

Recommended Posts

Boa noite, eu estou e criar um fórum por mim próprio para aprofundar os conhecimentos básicos de php que tenho

e agora estou a criar o ficheiro para criar posts/tópicos

já fiz várias validações ao input do utilizador:

*passar todo o unicode e símbolos a htmlentities

*tirar /n /t /r e por <br />

*e transformar as bbtags em html MAS

eu não gosto nada de ver um site com código html deste tipo:

<B><U>asdf</B></U>

o que quero fazer é que ordene as bbtags de maneira a respeitar o xhtml para aparecer assim:

<B><U>asdf</U></B>

então, pensei em resolver este problema assim:

1-separar as bbtags to post

2-e deixar o post num arry  e as bbtags noutro array

3-inventava um truque para ordenar array das bbtags para ficar xhtml correcto

  3.1- se possível fazer um log com as alterações

4-e depois substituía o bbcode por xhtml

5-e juntava a array do post mais a do xhtml

até agora só fiz o ponto um, e fiz metade do ponto dois, e só de pensar no ponto 3, fico todo atrofiado  ? ?

e depois fico a pensar, se eu for usar isto num fórum muito activo, (ex.: com 500 utilizadores simultâneos), este código deve comer cpu que sa farta

queria que alguém me desse dicas de como acabar o ponto 2 e 3, e sugestões/ideias para uma maneira de ordenar as bbtags para xhtml

aqui vai o que fiz até agora, sobre este assunto

<?php
//por as bbtags so com o inicio e o fim de cada tag, tirar o ']'
//


$post="  Você é [b]de que país? hh [/b]gfhfg [b]hh[/b]";

$postsize = strlen($post);


$bbtag = array (
1 => array(1=> "[color="  ,2=> "]"),
2 => array(1=> "[b"       ,2=> "]"),
3 => array(1=> "[/color" ,2=> "]"),
4 => array(1=> "[/b"      ,2=> "]")
); 
//organizar este array, nao precisa do "]"
$tot=0;

//dividir tags e texto
for ($h=1; $h <= 4;$h++)
  {
  for ($i=0;$i<=$postsize;$i++)//ver se tem varias vezes a mesma tag
    {
    if (is_int(stripos($post,$bbtag[$h][1],$i)))
      {
      $result[$tot][1] = stripos($post,$bbtag[$h][1],$i);
      $result[$tot][2] = stripos($post,']',$result[$tot][1]);
      $i=$result[$tot][2];
      $tot++;
      }
    }
  }
sort($result);
$num_tags=count($result);

for ($h=0; $h <= ($num_tags-1);$h++)
{
$tags[$h] = substr($post,$result[$h][1],$result[$h][2]-$result[$h][1]+1);
}

echo "<pre>";
echo var_dump($result);
echo "</pre>";

echo "<pre>";
echo var_dump($tags);
echo "</pre>";


?>

esperimentem este código

desculpem se tenho má pratica de programação, só aprendi php a partir do phpmanual e do w3school e do que aprendi na escola

Link to comment
Share on other sites

eu não gosto nada de ver um site com código html deste tipo:

<B><U>asdf<U><B>

o que quero fazer é que ordene as bbtags de maneira a respeitar o xhtml para aparecer assim:

<B><U>asdf<B><U>

O teu exemplo que supostamente respeita as regras, não as respeita. Isto sem contar que estás só a abrir tags e nunca as fechas.

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other sites

eu não gosto nada de ver um site com código html deste tipo:

<B><U>asdf<U><B>

o que quero fazer é que ordene as bbtags de maneira a respeitar o xhtml para aparecer assim:

<B><U>asdf<B><U>

O teu exemplo que supostamente respeita as regras, não as respeita. Isto sem contar que estás só a abrir tags e nunca as fechas.

oi, desculpa ai,

esqueci me do '/'do lado direito

mas o objectivo é por as tags como deve ser

vou editar o post inicial, para que mais ninguém se confunda

Link to comment
Share on other sites

eu não gosto nada de ver um site com código html deste tipo:

<B><U>asdf<U><B>

o que quero fazer é que ordene as bbtags de maneira a respeitar o xhtml para aparecer assim:

<B><U>asdf<B><U>

O teu exemplo que supostamente respeita as regras, não as respeita. Isto sem contar que estás só a abrir tags e nunca as fechas.

oi, desculpa ai,

esqueci me do '/'do lado direito

mas o objectivo é por as tags como deve ser

vou editar o post inicial, para que mais ninguém se confunda

Continua errado. Estás a fechar o <b> sem fechares o <u> que abriste lá dentro.

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other sites

eu não gosto nada de ver um site com código html deste tipo:

<B><U>asdf</B></U>

o que quero fazer é que ordene as bbtags de maneira a respeitar o xhtml para aparecer assim:

<B><U>asdf</U></B>

eu editei o post inicial, e o objectivo do script é isso mesmo, caso o utilizador fecha o <B> antes do <U>, o script tem que corrigir isso

é o que quero que o script faça

Link to comment
Share on other sites

Ah, agora já percebi!

O que eu faria era percorrer a "árvore" e ir adicionando a um array as tags que estão abertas. Quando encontrasse um fecho de uma tag, apagava a entrada na array. Se não tivesse presente naquele "ramo", ia procurar no seu "ramo-mãe" e por aí fora até encontrar a tag. Quando acabasse de percorrer o conteúdo da tag, fechava as tags que tinha referenciado no array.

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other sites

Ah, agora já percebi!

O que eu faria era percorrer a "árvore" e ir adicionando a um array as tags que estão abertas. Quando encontrasse um fecho de uma tag, apagava a entrada na array. Se não tivesse presente naquele "ramo", ia procurar no seu "ramo-mãe" e por aí fora até encontrar a tag. Quando acabasse de percorrer o conteúdo da tag, fechava as tags que tinha referenciado no array.

entendi a tua ideia e vou fazer amanha um diagrama disso e postar aqui

Link to comment
Share on other sites

  • 2 weeks later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.