Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Parser BBCode, Klasa, PHP 5
Louner
post 31.01.2008, 13:19:32
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. 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

Ten post edytował Louner 15.02.2009, 20:11:20
Go to the top of the page
+Quote Post
vokiel
post 31.01.2008, 14:46:39
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 31.01.2008, 15:04:11
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. winksmiley.jpg Zajmę się tym później, teraz niech zostanie jak jest.

[edit.31.01.2008]
Już dodałem tagi list. winksmiley.jpg

Ten post edytował Louner 31.01.2008, 20:19:45
Go to the top of the page
+Quote Post
daw22
post 2.02.2008, 10:38:33
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 2.02.2008, 15:39:36
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 winksmiley.jpg

Ten post edytował Louner 2.02.2008, 15:41:54
Go to the top of the page
+Quote Post
daw22
post 2.02.2008, 18:33:00
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 2.02.2008, 19:07:04
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. 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 2.02.2008, 19:18:51
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 2.02.2008, 21:41:22
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


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
Louner
post 22.03.2008, 20:33:48
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 . smile.gif

Pozdrawiam
Go to the top of the page
+Quote Post
nrm
post 23.06.2008, 18:58:19
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 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 31.05.2009, 15:20:42
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 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

Ten post edytował luniak 31.05.2009, 15:26:12


--------------------
Jeżeli ktoś na forum Ci pomógł, możesz mu podziękować klikając w opcje "Pomógł" pod jego postem!
--------------------

Go to the top of the page
+Quote Post
Louner
post 28.06.2009, 21:54:23
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. 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 29.06.2009, 12:40:51
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 19.08.2009, 15:12:40
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


--------------------
textmate @mac

trance / buraki
Go to the top of the page
+Quote Post
pionas
post 10.09.2009, 13:47:17
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...


--------------------
Organizujesz konkurs? Chcesz coś wygrać? Wejdź na www.e-Konkursy.info :)
Go to the top of the page
+Quote Post
peter13135
post 29.11.2009, 17:41:02
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 29.11.2009, 19:27:03
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 29.11.2009, 21:31:34
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 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


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 19:53