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( "#\<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( "#\<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( "#\[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( "#\[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( "#\[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ę.