Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Parser BBCode
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
Louner
Demo:
http://pliki.puklerz.pl/parser/

Źródło:
http://pliki.puklerz.pl/parser/parser.class.phps

Download:
http://pliki.puklerz.pl/parser/parser.zip

Szybka, prosta i zgrabna klasa parseru. Jestem praktycznie pewien, że nie pogubi się w tagach i wszystkie odpowiednio zinterpretuje. winksmiley.jpg Dodatkowo, sprawdza ich kolejność i jest banalna w obsłudze i modyfikacji.

Konfiguracja klasy:


Mam nadzieję, że jest na tyle intuicyjna, że nie trzeba nic tłumaczyć. smile.gif

  1. <?php
  2. private $config = array
  3.        (
  4.            'open_string' => array('[',']'),
  5.            'close_string' => array('[/',']')
  6.        );
  7.    
  8.    private $tags = array
  9.        (
  10.            'b' => '<strong>{value}</strong>',
  11.            'i' => '<span style="font-style:italic;">{value}</span>',
  12.            'u' => '<span style="text-decoration:underline;">{value}</span>',
  13.            'img' => '<img src="{value}" alt="obrazek" title="{parameter}" />',
  14.            'url' => '<a href="{value}">{parameter}</a>',
  15.            'size' => '<span style="font-size:{parameter}px">{value}</span>',
  16.            'ul' => '<ul>{value}</ul>',
  17.            'ol' => '<ol>{value}</ol>',
  18.            'li' => '<li>{value}</li>'
  19.        );
  20. ?>


Schemat tagu przy powyższej konfiguracji:

Kod
[tag=parametr]wartość[/tag]


Sposób użycia:
  1. <?php
  2. if( $wynik = $parser -> parse($jakis_tekst) )
  3. {
  4.   echo $wynik;
  5. } else
  6. // false
  7. {
  8.   echo 'tagi są w błednej kolejności!';
  9. }
  10. ?>


[edit.31.01.2008]
Dodałem tagi list, przykład:

Kod
[ul]
[li]test[/li]
[li]test2[/li]
[/ul]


[edit.22.03.2008]
Parę poprawek, m.in nie ma potrzeby stosowanie cudzysłowu przy ustalaniu parametrów.

Życzę miłego użytkowania. winksmiley.jpg
vokiel
A co z listami (ul, li, ol...) ?
Louner
@vokiel
Możesz sobie dopisać edytując zmienną $tags, i funkcję check_tag, żeby sprawdzić, jak w ul, ol są poukładane tagi li. winksmiley.jpg Zajmę się tym później, teraz niech zostanie jak jest.

[edit.31.01.2008]
Już dodałem tagi list. winksmiley.jpg
daw22
nie wiem czemu ale u mnie gdy tylko dołączam klasę parser'a od razu robi się biała strona, nawet włączenie raportowania na wszystko, nie pomaga, nawet nie chce mi wypluć żadnego komunikatu błędu.
Nie wiem czym jest to spowodowane, dodam tylko, że wgrywam "czystą" wersję bez przeróbek bo myślałem, że to one jakiś błąd powodują
Louner
Nie wiem do końca w czym może leżeć błąd, skrypt generuje go tylko w jednym miejscu, w linii 127, jeżeli jakimś cudem przez wyrażenie regularne z linii 86 przedostałyby się znaczniki otwierające i zamykające tag ( inne niż w $this -> config['open_string'] lub $this -> config['close_string'] ). Dodatkowo, użyłem dla własnej wygody '@' w linii 272, żeby skrypt nie wypisywał błędu o wyjściu poza tablicę ( @$tags_between[$key+1][0] ). Być może tam jest usterka.

Powodzenia winksmiley.jpg
daw22
ale to właśnie biała strona pojawia się wtedy, gdy chcę dołączyć plik klasy do strony, bez żadnych innych czynności.
Usunąłem małpkę z linii 272, lecz nadal nic ;S
Louner
Z jakiej wersji PHP korzystasz? Skrypt musi generować u Ciebie jakis błąd, tylko nie jest wyświetlany. tongue.gif Takie rzeczy zdarzają się z joomlą, albo phpbb przema i też chodzi o jakieś charakterystyczne usterki.
daw22
PHP 5.2.5, raportowanie mam ustawione na E_ALL.
Nie wiem co może być przyczyną
.radex
zrób możliwość nie podania cudzysłowu po = np zamiast
[ url="http://wupe" ]http://wp.pl[ /url ]
[ url=http://wupe ]http://wp.pl[ /url ]

często się o tym zapomina
Louner
Dodałem parę poprawek, m.in nie ma potrzeby stosowanie cudzysłowu przy ustalaniu parametrów. Nowy kod jest do pobrania pod starymi linkami . smile.gif

Pozdrawiam
nrm
tak btw: u mnie to samo czyli nawet zamiast standardowego przykładu z Twojego demo jest false. Podpiąłem dla testu pod istniejące już forum (aby skorzystać z gotowych bbcode userów) i tam zauważyłem, że niektóre posty przechodzą ale na ogól jednak jest false. Niestety nie zaobserwowałem żadnej zależności pomiędzy treścią, a błędem. Co najdziwniejsze nawet ten twój przykład daje false winksmiley.jpg

Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.1 with Suhosin-Patch
X-Powered-By: PHP/5.2.4-2ubuntu5.1
luniak
Ja właśnie użyłem tej klasy i jak na razie działa bezproblemowo smile.gif
mam tylko 1 uwagę smile.gif czy dałoby się zrobić tak że jeżeli mamy tekst objęty jakimś zadeklarowanym tagiem
np.
  1. [ code][/ code]

to żeby nie parsowało zawartości tych znaczników smile.gif <img src="style_emoticons/<#EMO_DIR#>/questionmark.gif" style="vertical-align:middle" emoid="??" border="0" alt="questionmark.gif" />
bo próbowałem sam jakoś do tego dojść ale mi nie wyszło smile.gif

chodzi mi oto żeby nie były to na sztywno podane wyżej znacznki ale żeby można było je sobie zadeklarować smile.gif
podobnie jak jest tu czyli różny wygląd dla tagów

Kod
tekst

  1. <?php
  2. tekst
  3. ?>

  1. tekst


itd
Louner
Napisalem skrypt parseru praktycznie od nowa, działa szybciej i lepiej. Tym razem zamiast 'false' zwraca tablicę z komunikatem, gdy podczas parsowania nastapił błąd, a zwykłego stringa gdy wszystko jest ok. smile.gif

Podpiąłem wszystko pod stary link downloadu i przykład, ale nie wiem czemu nie mogę zedytować pierwszego posta.
bim2
Cytat(Louner @ 28.06.2009, 20:54:23 ) *
ale nie wiem czemu nie mogę zedytować pierwszego posta.

Temat: Edycja_postow
b3
bardziej mi jakos podchodzi kod z plagina do smarty..

  1. function smarty_modifier_bbcode2html($message) {
  2. $preg = array(
  3. '/(?<!\\\\)\[color(?::\w+)?=(.*?)\](.*?)\[\/color(?::\w+)?\]/si' => "<span style=\"color:\\1\">\\2</span>",
  4. '/(?<!\\\\)\[size(?::\w+)?=(.*?)\](.*?)\[\/size(?::\w+)?\]/si' => "<span style=\"font-size:\\1\">\\2</span>",
  5. '/(?<!\\\\)\[font(?::\w+)?=(.*?)\](.*?)\[\/font(?::\w+)?\]/si' => "<span style=\"font-family:\\1\">\\2</span>",
  6. '/(?<!\\\\)\[align(?::\w+)?=(.*?)\](.*?)\[\/align(?::\w+)?\]/si' => "<div style=\"text-align:\\1\">\\2</div>",
  7. '/(?<!\\\\)\[b(?::\w+)?\](.*?)\[\/b(?::\w+)?\]/si' => "<span style=\"font-weight:bold\">\\1</span>",
  8. '/(?<!\\\\)\[i(?::\w+)?\](.*?)\[\/i(?::\w+)?\]/si' => "<span style=\"font-style:italic\">\\1</span>",
  9. '/(?<!\\\\)\[u(?::\w+)?\](.*?)\[\/u(?::\w+)?\]/si' => "<span style=\"text-decoration:underline\">\\1</span>",
  10. '/(?<!\\\\)\[center(?::\w+)?\](.*?)\[\/center(?::\w+)?\]/si' => "<div style=\"text-align:center\">\\1</div>",
  11.  
  12. // [code] & [php]
  13. '/(?<!\\\\)\[code(?::\w+)?\](.*?)\[\/code(?::\w+)?\]/si' => "<div class=\"bb-code\">\\1</div>",
  14. '/(?<!\\\\)\[php(?::\w+)?\](.*?)\[\/php(?::\w+)?\]/si' => "<div class=\"bb-php\">\\1</div>",
  15. // [email]
  16. '/(?<!\\\\)\[email(?::\w+)?\](.*?)\[\/email(?::\w+)?\]/si' => "<a href=\"mailto:\\1\" class=\"bb-email\">\\1</a>",
  17. '/(?<!\\\\)\[email(?::\w+)?=(.*?)\](.*?)\[\/email(?::\w+)?\]/si' => "<a href=\"mailto:\\1\" class=\"bb-email\">\\2</a>",
  18. // [url]
  19. '/(?<!\\\\)\[url(?::\w+)?\]www\.(.*?)\[\/url(?::\w+)?\]/si' => "<a href=\"http://www.\\1\" target=\"_blank\" class=\"bb-url\">\\1</a>",
  20. '/(?<!\\\\)\[url(?::\w+)?\](.*?)\[\/url(?::\w+)?\]/si' => "<a href=\"\\1\" target=\"_blank\" class=\"bb-url\">\\1</a>",
  21. '/(?<!\\\\)\[url(?::\w+)?=(.*?)?\](.*?)\[\/url(?::\w+)?\]/si' => "<a href=\"\\1\" target=\"_blank\" class=\"bb-url\">\\2</a>",
  22. // [img]
  23. '/(?<!\\\\)\[img(?::\w+)?\](.*?)\[\/img(?::\w+)?\]/si' => "<img src=\"\\1\" alt=\"\\1\" class=\"bb-image\" />",
  24. '/(?<!\\\\)\[img(?::\w+)?=(.*?)x(.*?)\](.*?)\[\/img(?::\w+)?\]/si' => "<img width=\"\\1\" height=\"\\2\" src=\"\\3\" alt=\"\\3\" class=\"bb-image\" />",
  25. // [quote]
  26. '/(?<!\\\\)\[quote(?::\w+)?\](.*?)\[\/quote(?::\w+)?\]/si' => "<div>Quote:<div class=\"bb-quote\">\\1</div></div>",
  27. '/(?<!\\\\)\[quote(?::\w+)?=(?:&quot;|"|\')?(.*?)["\']?(?:&quot;|"|\')?\](.*?)\[\/quote\]/si' => "<div>Quote \\1:<div class=\"bb-quote\">\\2</div></div>",
  28. // [list]
  29. '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[\*(?::\w+)?\](.*?)(?=(?:\s*<br\s*\/?>\s*)?\[\*|(?:\s*<br\s*\/?>\s*)?\[\/?list)/si' => "\n<li class=\"bb-listitem\">\\1</li>",
  30. '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[\/list(:(?!u|o)\w+)?\](?:<br\s*\/?>)?/si' => "\n</ul>",
  31. '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[\/list:u(:\w+)?\](?:<br\s*\/?>)?/si' => "\n</ul>",
  32. '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[\/list:o(:\w+)?\](?:<br\s*\/?>)?/si' => "\n</ol>",
  33. '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(:(?!u|o)\w+)?\]\s*(?:<br\s*\/?>)?/si' => "\n<ul class=\"bb-list-unordered\">",
  34. '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list:u(:\w+)?\]\s*(?:<br\s*\/?>)?/si' => "\n<ul class=\"bb-list-unordered\">",
  35. '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list:o(:\w+)?\]\s*(?:<br\s*\/?>)?/si' => "\n<ol class=\"bb-list-ordered\">",
  36. '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=1\]\s*(?:<br\s*\/?>)?/si' => "\n<ol class=\"bb-list-ordered,bb-list-ordered-d\">",
  37. '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=i\]\s*(?:<br\s*\/?>)?/s' => "\n<ol class=\"bb-list-ordered,bb-list-ordered-lr\">",
  38. '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=I\]\s*(?:<br\s*\/?>)?/s' => "\n<ol class=\"bb-list-ordered,bb-list-ordered-ur\">",
  39. '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=a\]\s*(?:<br\s*\/?>)?/s' => "\n<ol class=\"bb-list-ordered,bb-list-ordered-la\">",
  40. '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=A\]\s*(?:<br\s*\/?>)?/s' => "\n<ol class=\"bb-list-ordered,bb-list-ordered-ua\">",
  41. // escaped tags like \[b], \[color], \[url], ...
  42. '/\\\\(\[\/?\w+(?::\w+)*\])/' => "\\1"
  43.  
  44. );
  45. $message = preg_replace(array_keys($preg), array_values($preg), $message);
  46. return $message;
  47. }


  1. ul.bb-list-unordered { }
  2. ol.bb-list-ordered { }
  3. ol.bb-list-ordered-d { list-style-type:decimal; }
  4. ol.bb-list-ordered-lr { list-style-type:lower-roman; }
  5. ol.bb-list-ordered-ur { list-style-type:upper-roman; }
  6. ol.bb-list-ordered-la { list-style-type:lower-alpha; }
  7. ol.bb-list-ordered-ua { list-style-type:upper-alpha; }
  8. ol.bb-listitem { }
  9.  
  10. .bb-code,
  11. .bb-php {
  12. border: 1px solid black;
  13. padding: 10px;
  14. font-family: Courier;
  15. white-space: nowrap;
  16. }
  17.  
  18. .bb-quote {
  19. border: 1px solid black;
  20. padding: 10px;
  21. }
  22.  
  23. .bb-email { }
  24. .bb-url { }
  25.  
  26. .bb-image {
  27. border-width: 0;
  28. border-style: none;
  29. }
pionas
fajna ta klasa jednak mam jedno pytanie - czy myślałeś aby wprowadzane zmiany były natychmiast widoczne tzn. chodzi mi tak jak to jest w "wysiwyg" że nie widzimy znaczników a efekt końcowy...
peter13135
linki zdają się prowadzić do nikąd
Louner
Postaram się coś z tym zrobić w ciągu najbliższych kilku dni.
skowron-line
@Louner a jest możliwość dodania własnych tagów questionmark.gif bo brakuje mi tu kilku np. sub, sup, code=name
Edit: chyba że mam starą wersję znalazłem ją na phpclasses.org.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.