Witam,
Jestem w trakcie pisania strony, na której zamieściłem BBCode. Są to dwie funkcje, gdzie jedna zmienia z HTML na BBCode, a druga z BBCode na HTML:
<?php
function bbcode_encode( $str )
{
$str = preg_replace( "#\<left\>(.*?)\</left\>#si",'\\1
', $str ); $str = preg_replace( "#\<center\>(.*?)\</center\>#si",'\\1
', $str ); $str = preg_replace( "#\<right\>(.*?)\</right\>#si",'\\1
', $str ); $str = preg_replace( "#\<font size=\"(.*?)\"\>(.*?)\</font\>#si",'\2', $str ); $str = preg_replace( "#\<font color=\"(.*?)\"\>(.*?)\</font\>#si",'\2', $str ); $str = preg_replace( "#\<font color=\"(.*?)\" size=\"(.*?)\"\>(.*?)\</font\>#si",'[font color=\\1 size=\\2]\\3[/font]', $str ); $str = preg_replace( "#\<font size=\"(.*?)\" color=\"(.*?)\"\>(.*?)\</font\>#si",'[font size=\\1 color=\\2]\\3[/font]', $str ); $str = preg_replace( "#\<img src=\"(.*?)\" /\>#si",'[img]\\1[/img/]', $str ); $str = preg_replace( "#\<a href=\"(.*?)\" target=\"_blank\">(.*?)\</a\>#si", "\\2", $str ); $str = preg_replace( "#\<div style=\"(.*?)\"\>(.*?)\</div\>#si", '[div style=\\1]\\2[/div]', $str ); $str = preg_replace( "#\<iframe width=\"640\" height=\"360\" src=\"http://www.youtube.com/embed/(.*?)\" frameborder=\"0\" allowfullscreen\>\</iframe\>#si",'[youtube]\\1[/youtube]',$str );
return $str;
}
function bbcode_decode( $str )
{
$str = preg_replace( "#\[b\](.*?)\[/b\]#si",'<b>\\1</b>', $str ); $str = preg_replace( "#\[i\](.*?)\[/i\]#si",'<i>\\1</i>', $str ); $str = preg_replace( "#\[u\](.*?)\[/u\]#si",'<u>\\1</u>', $str ); $str = preg_replace( "#\[s\](.*?)\[/s\]#si",'<s>\\1</s>', $str ); $str = preg_replace( "#\[left\](.*?)\[/left\]#si",'<left>\\1</left>', $str ); $str = preg_replace( "#\[center\](.*?)\[/center\]#si",'<center>\\1</center>', $str ); $str = preg_replace( "#\[right\](.*?)\[/right\]#si",'<right>\\1</right>', $str ); $str = preg_replace( "#\[font color=(.*?) size=(.*?)\](.*?)\[/font\]#si",'<font color="\\1" size="\\2">\\3</font>', $str ); $str = preg_replace( "#\[font size=(.*?) color=(.*?)\](.*?)\[/font\]#si",'<font size="\\1" color="\\2">\\3</font>', $str ); $str = preg_replace( "#\[size=(.*?)\](.*?)\[/size\]#si",'<font size="\\1">\\2</font>', $str ); $str = preg_replace( "#\[color=(.*?)\](.*?)\[/color\]#si",'<font color="\\1">\\2</font>', $str ); $str = preg_replace( "#\[img\](.*?)\[/img\]#si",'<img src="\\1" alt="" />', $str ); $str = preg_replace( "#\[url=(http.*?)\](.*?)\[/url\]#si", "<a href=\"\\1\" target=\"_blank\">\\2</a>", $str ); $str = preg_replace( "#\[url=(.*?)\](.*?)\[/url\]#si", "<a href=\"http://\\1\" target=\"_blank\">\\2</a>", $str ); $str = preg_replace( "#\[div style=(.*?)\](.*?)\[/div\]#si",'<div style="\\1">\\2</div>', $str ); $str = preg_replace( "#\[youtube\](.*?)\[/youtube\]#si",'<iframe width="640" height="360" src="http://www.youtube.com/embed/\\1" frameborder="0" allowfullscreen></iframe>', $str ); return $str;
}
?>
Domyślam się, że może nie wygląda to najlepiej i nie jest to najlepszy sposób na parsowanie tekstu, ale optymalizować kod będę później, na razie chcę doprowadzić to do stanu działania.
Problem polega na tym, że chciałbym dodać bbcode [file id=(jakaś liczba)]Tekst[/file]. W bazie danych mam tabelę `files`, która zawiera pola `ID` integer, auto increment, `name` varchar oraz `price` integer. W pole tekstowe, które następnie parsuje BBCode w HTML wpisuję dla przykładu [file id=5]Pobierz plik[/file]. Chciałbym żeby parser odczytał id 5, następnie pobrał z tabeli MySQL `files` pola `name` i `price`, gdzie `ID` = '5', po czym zmienił ten bbcode w pole form i umieścił w pola hidden "id", "name" i "price" odpowiednie wartości z MySQL.
Chciałbym prosić o pomoc lub nakierowanie, jak mogę coś takiego zrobić. Domyślam się, że preg_replace nie umożliwia pobrania `id`, dlatego jak można ten tekst sparsować w inny sposób?
Pozdrawiam.
############
@Edit
Problem został rozwiązany.
Rozwiązaniem jest wykorzystanie preg_match_all('/\[file(.*?)](.*?)\[\/file\]/msi', $str, $matches); a następnie wykorzystanie pętli foreach, a w niej preg_replace.
Można temat zamknąć, dziękuję.
Ten post edytował Grim90 4.09.2013, 23:19:44