Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [klasa] Zaawansowany parser bbcode (php5), advanced bbcode parser
wookieb
post 2.03.2009, 14:10:58
Post #1





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Projekt jest już na githubie pod adresem
https://github.com/wookieb/bbcode

Proszę o dodawanie informacji o bugach właśnie tam.

UPDATE Wersja 1.2
[php bbcode, parser bbcode, advanced bbcode parser]
Chciałbym dziś zaprezentować swój mechanizm parsujący kod bbcode oraz ułatwiający nam kontrolę nad tym czy tagi są prawidłowo używane.
Klasa do pobrania:
https://github.com/wookieb/bbcode/zipball/master

Przykład działania:
http://wookieb.pl/bbcode/test.php

Readme.html w paczce oraz pod adresem http://wookieb.pl/bbcode/readme.html


Licencja
Skrypt wydany na licencji BSD. Dla własnego jak i komercyjnego użytku.

Ustawienia parsera
Ustawienia dla parsera znajdują się teraz w klasie BbCodeSettings. Ciekawsze z ustawień to

Zaufany kod
  1. $settings->trustText = false; // kod niezaufany
  2. $settings->trustText = true; // kod zaufany


Ustawienie kontroluje stopień sprawdzenia danych. Gdy kod bbcode sparsowaliśmy wcześniej to pobieramy jest wersję zaufaną i zapisujemy.
  1. $code = $bbcode->getBbcode();


Przy ponownym odczytaniu kodu, możemy oznaczyć kod jak zaufany. Spowoduje to ominięcie wielu operacji kontroli atrybutów, przez co parsowanie jest szybsze.

Kod
$bbcode = new BbCode();

$text='[b] Bla Bla [i] Hehe';
$bbcode->parse($text, false); // nie chcemy wyniku wiec ustawiamy na false
$code=$bbcode->getBbcode(); // [b] Bla Bla [i] Hehe[/i][/b]

// $code zapisujemy


// po pewnym czasie odczytujemy i parsujemy go jeszcze raz
$bbcode->getSettings()->trustText = true;
echo $bbcode->parse($code);


Dostępność tagów
Możliwe jest włączenie tylko niektórych tagów parsera

Kod
$bbcode = new BbCode();
$text = '[b]Pogrubienie[/b]
[i]Kursywa[/i]';

echo $bbcode->parse($text);
// <b>Pogrubienie</b>
// <i>Kursywa</i>

$bbcode->getSettings()->availableTags = array('b');
echo $bbcode->parse($text);
// <b>Pogrubienie</b>
// Kursywa



Walidacja HTML (kolejności użycia)
Domyślnie parser poprawia kolejność użycia tagów.
np kod
Kod
[b] pogrubienie [i] Kursywa[/b]
[ul]
    [li]Element listy
[/b]
[/i]

Zamieni na

Kod
[b] pogrubienie [i] Kursywa[/i][/b]
[ul]
    [li]Element listy[/li]
[/ul]


Tworzenie zajawek
Parser potrafi tworzyć zajawke o odpowiedniej ilości znaków (ignorując przy tym tagi bbcode).
Wspiera różne kodowania.

Test pod adresem http://wookieb.pl/bbcode/cut_test.php


Rozszerzanie możliwości
Za pomocą tworzenia nowych tagów i dodawania ich specjalnych ustawień można rozszerzyć bbcode o dodatkowe tagi, możliwości.
Szczególnie chciałbym zwrócić uwage na możliwość "przetrzepania" kodu przez funkcje filtrów, dzięki którym możemy tworzyć zaawansowane zależności.
Informacje na temat ustawień dostępne pod linkiem http://wookieb.pl/bbcode/readme.html

ZACHĘCAM DO OCEN, WNOSZENIA WŁASNYCH UWAG A TAKŻE PROPOZYCJI ZMIAN
Mam nadzieję, że przyda się niejednej osobie, która dostrzeże możliwości użycia parsera NIE TYLKO do Bbcode smile.gif i nie tylko.

Update - 2009.05.31
Dodałem tag youtube do paczki.


Inne zmiany:
- poprawiony generowany kod html dla taga IMG
- poprawiona metoda wyszukiwania nazwy taga
- poprawiona szybkość działania
- przeniesienie ustawień do BbCodeSettings
- poprawiona walidacji urli
- dodatkowe zabezpieczenia przed XSS

Ten post edytował wookieb 23.08.2011, 19:46:20
Powód edycji: [wookieb]: [wookieb]: [Spawnm]: update


--------------------
Go to the top of the page
+Quote Post
12 Stron V  « < 10 11 12  
Start new topic
Odpowiedzi (220 - 226)
szajens
post 6.07.2014, 10:57:02
Post #221





Grupa: Zarejestrowani
Postów: 150
Pomógł: 4
Dołączył: 3.01.2010

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


Przepuszcza 2 razy </b> co może troszkę zepsuć stronę, niestety.

Nie sprawdzałem innych tagów

  1. $text='[ul]
  2. [li]Internet Explorer,
  3. [li][li][li][li][li][li]Firefox,[/li]
  4. [li]Google Chrome 4.0,[/li][/b][/b]
  5. [li]Safari 3.0.[/li]
  6. [/ul]';


  1. <ul>
  2. <li>Internet Explorer,<br />
  3. <b>Firefox,</b></li></b>
  4. <li>Google Chrome 4.0,</li>
  5. <li>Google Chrome 4.0,</li>
  6. <li>Safari 3.0.</li>
  7. </ul>


edit:w rzędzie li jest w środku b, poprostu forumowe bbcode wycieło

Ten post edytował szajens 6.07.2014, 11:01:02
Go to the top of the page
+Quote Post
boro11
post 6.08.2014, 04:04:36
Post #222





Grupa: Zarejestrowani
Postów: 283
Pomógł: 11
Dołączył: 9.07.2010
Skąd: Warszawa

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


Hej,
przejrzałem dokumentację i parę tagów dostosował pod swoje potrzeby, ale mam problem z emotikonami.
Czy jest możliwość żeby parser wyłapywał z tekstu i zamieniał na obrazki "uśmieszki"
Są dodawane do bazy danych bez znaków "[" i "]" dlatego mam lekki problem w ustawieniu tak parsera żeby brał pod uwagę sam tekst bez tych otwierających i zamykających nawiasów. Jest taka możliwość?

Z góry dziękuję za pomoc jak i za samą klasę smile.gif
Go to the top of the page
+Quote Post
Forti
post 14.12.2014, 11:08:42
Post #223





Grupa: Zarejestrowani
Postów: 655
Pomógł: 73
Dołączył: 2.05.2014

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


Ze względu na beznadzieje parserów BBcode dla symfony (jeden nie działa na wyższych v niż 2.4, drugi jakieś bugi mi z lokalizacją - nie istotne), pozwoliłem sobie na modyfikację biblioteki. Dodałem namespace i utworzyłem sobie twig extension.

wystarczy dodać namespace do:

bbcode
BbCodeSettings
DataValidator

oraz wszelkie required w tych 3 klasach zamienić na po prostu use.

W katalogu filters jest troche inaczej - dodajemy use lecz nie dodajemy namespace. Jest to mało oryginalne rozwiązanie, lecz działające.

Zrobiłem twig extension w taki sposób:

  1. <?php
  2.  
  3. namespace acme\DemoBundle\Twig;
  4.  
  5. use acme\DemoBundle\Lib\Bbcode\BbCode;
  6.  
  7. class BbcodeExtension extends \Twig_Extension
  8. {
  9. public function getFilters()
  10. {
  11. return array(
  12. new \Twig_SimpleFilter('bbcode', array($this, 'bbCodeParser')),
  13. );
  14. }
  15.  
  16. public function bbCodeParser($rawText)
  17. {
  18. $text = htmlspecialchars($rawText);
  19. $bbcode = new BbCode();
  20. $bbcode->parse($text, false);
  21.  
  22. return $bbcode->getHtml();
  23. }
  24.  
  25. public function getName()
  26. {
  27. return 'acme_bbcode_extension';
  28. }
  29. }


Dodatkowo service (acme/DemoBundle/Resources/Config/services)
i w twig oczywiście musimy zrobić tak:

  1. services:
  2. acme.bbcode_extension:
  3. class: acme\DemoBundle\Twig\BbcodeExtension
  4. tags:
  5. - { name: twig.extension }


w twigu oczywiście:

  1. {{ comment.text|bbcode|raw }} // |raw musi być, inaczej twig robi dodatkowe swoje htmlspecialchars, który my zrobiliśmy przed parsowaniem.



Może komuś się przyda, zwłaszcza żę mamy w tym bbcode m.in. youtube wink.gif


edit:

czy wookie nie obrazi się, jak zrobie z tego odzielnego, nie zależnego Bundle dla symfony i umieszcze na Package wraz z composerem? wink.gif

Ten post edytował Forti 14.12.2014, 11:11:28


--------------------
Overwatch24 - najbardziej zaawansowany Polski portal Overwatch od fanów dla fanów.

Fachowo.co

Behance.net/fachowo
Go to the top of the page
+Quote Post
wookieb
post 14.12.2014, 11:35:43
Post #224





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Z przyjemnością smile.gif Jak dodasz to umieszczę potem link do Twojego bundle smile.gif

RAW nie będzie potrzebny jeśli ... http://twig.sensiolabs.org/doc/advanced.ht...omatic-escaping
Powód edycji: [wookieb]:


--------------------
Go to the top of the page
+Quote Post
Forti
post 5.02.2015, 22:38:03
Post #225





Grupa: Zarejestrowani
Postów: 655
Pomógł: 73
Dołączył: 2.05.2014

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


Wookie pilnuj mnie tongue.gif

Całość mam już gotowe - troche refactoringu i jeszcze testy muszę napisać, chociaż i tak aby dodać do "oficjalnego" repo musi być pokryte nimi 80% kodu ;d

https://github.com/Fortidude/bbcode/

Ten post edytował Forti 5.02.2015, 22:38:37


--------------------
Overwatch24 - najbardziej zaawansowany Polski portal Overwatch od fanów dla fanów.

Fachowo.co

Behance.net/fachowo
Go to the top of the page
+Quote Post
wookieb
post 6.02.2015, 05:26:04
Post #226





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Na pewno zrobisz to lepiej smile.gif

Pisałem to tak dawno temu iż wiem, że teraz zrobiłbym to zupełnie inaczej. Swoją drogą polecam ten oto kurs https://www.coursera.org/course/compilers zanim zaczniesz pracę nad parserem smile.gif


--------------------
Go to the top of the page
+Quote Post
pionas
post 1.03.2015, 19:35:18
Post #227





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

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


Hej,

po aktualizacji PHP do 5.4.38 parser nie działa.
Wiecie czemu tak się dzieje?


--------------------
Organizujesz konkurs? Chcesz coś wygrać? Wejdź na www.e-Konkursy.info :)
Go to the top of the page
+Quote Post

12 Stron V  « < 10 11 12
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: 13.06.2024 - 07:48