Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Parser BBCode, Klasa, PHP 5
Louner
post
Post #1





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 20.06.2005
Skąd: Bielsk Podlaski

Ostrzeżenie: (0%)
-----


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. (IMG:http://forum.php.pl/style_emoticons/default/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ć. (IMG:http://forum.php.pl/style_emoticons/default/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. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował Louner 15.02.2009, 20:11:20
Go to the top of the page
+Quote Post
vokiel
post
Post #2





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


A co z listami (ul, li, ol...) ?
Go to the top of the page
+Quote Post
Louner
post
Post #3





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 20.06.2005
Skąd: Bielsk Podlaski

Ostrzeżenie: (0%)
-----


@vokiel
Możesz sobie dopisać edytując zmienną $tags, i funkcję check_tag, żeby sprawdzić, jak w ul, ol są poukładane tagi li. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Zajmę się tym później, teraz niech zostanie jak jest.

[edit.31.01.2008]
Już dodałem tagi list. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował Louner 31.01.2008, 20:19:45
Go to the top of the page
+Quote Post
daw22
post
Post #4





Grupa: Zarejestrowani
Postów: 64
Pomógł: 1
Dołączył: 1.09.2007

Ostrzeżenie: (0%)
-----


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ą
Go to the top of the page
+Quote Post
Louner
post
Post #5





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 20.06.2005
Skąd: Bielsk Podlaski

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował Louner 2.02.2008, 15:41:54
Go to the top of the page
+Quote Post
daw22
post
Post #6





Grupa: Zarejestrowani
Postów: 64
Pomógł: 1
Dołączył: 1.09.2007

Ostrzeżenie: (0%)
-----


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

Ten post edytował daw22 2.02.2008, 18:34:05
Go to the top of the page
+Quote Post
Louner
post
Post #7





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 20.06.2005
Skąd: Bielsk Podlaski

Ostrzeżenie: (0%)
-----


Z jakiej wersji PHP korzystasz? Skrypt musi generować u Ciebie jakis błąd, tylko nie jest wyświetlany. (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Takie rzeczy zdarzają się z joomlą, albo phpbb przema i też chodzi o jakieś charakterystyczne usterki.
Go to the top of the page
+Quote Post
daw22
post
Post #8





Grupa: Zarejestrowani
Postów: 64
Pomógł: 1
Dołączył: 1.09.2007

Ostrzeżenie: (0%)
-----


PHP 5.2.5, raportowanie mam ustawione na E_ALL.
Nie wiem co może być przyczyną
Go to the top of the page
+Quote Post
.radex
post
Post #9





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

Ostrzeżenie: (0%)
-----


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

Ten post edytował radex_p 2.02.2008, 21:45:17
Go to the top of the page
+Quote Post
Louner
post
Post #10





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 20.06.2005
Skąd: Bielsk Podlaski

Ostrzeżenie: (0%)
-----


Dodałem parę poprawek, m.in nie ma potrzeby stosowanie cudzysłowu przy ustalaniu parametrów. Nowy kod jest do pobrania pod starymi linkami . (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Pozdrawiam
Go to the top of the page
+Quote Post
nrm
post
Post #11





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
luniak
post
Post #12





Grupa: Zarejestrowani
Postów: 171
Pomógł: 36
Dołączył: 12.01.2008
Skąd: Puszcza Mariańska

Ostrzeżenie: (0%)
-----


Ja właśnie użyłem tej klasy i jak na razie działa bezproblemowo (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
mam tylko 1 uwagę (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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ć (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
podobnie jak jest tu czyli różny wygląd dla tagów

Kod
tekst

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

  1. tekst


itd

Ten post edytował luniak 31.05.2009, 15:26:12
Go to the top of the page
+Quote Post
Louner
post
Post #13





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 20.06.2005
Skąd: Bielsk Podlaski

Ostrzeżenie: (0%)
-----


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. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Podpiąłem wszystko pod stary link downloadu i przykład, ale nie wiem czemu nie mogę zedytować pierwszego posta.
Go to the top of the page
+Quote Post
bim2
post
Post #14





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


Cytat(Louner @ 28.06.2009, 20:54:23 ) *
ale nie wiem czemu nie mogę zedytować pierwszego posta.

Temat: Edycja_postow
Go to the top of the page
+Quote Post
b3
post
Post #15





Grupa: Zarejestrowani
Postów: 65
Pomógł: 2
Dołączył: 25.08.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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. }


Ten post edytował b3 19.08.2009, 15:14:16
Go to the top of the page
+Quote Post
pionas
post
Post #16





Grupa: Zarejestrowani
Postów: 70
Pomógł: 2
Dołączył: 25.03.2009
Skąd: Pionki

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
peter13135
post
Post #17





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


linki zdają się prowadzić do nikąd
Go to the top of the page
+Quote Post
Louner
post
Post #18





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 20.06.2005
Skąd: Bielsk Podlaski

Ostrzeżenie: (0%)
-----


Postaram się coś z tym zrobić w ciągu najbliższych kilku dni.
Go to the top of the page
+Quote Post
skowron-line
post
Post #19





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


@Louner a jest możliwość dodania własnych tagów (IMG:style_emoticons/default/questionmark.gif) bo brakuje mi tu kilku np. sub, sup, code=name
Edit: chyba że mam starą wersję znalazłem ją na phpclasses.org.

Ten post edytował skowron-line 29.11.2009, 21:34:27
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 22:33