Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [klasa] Zaawansowany parser bbcode (php5), advanced bbcode parser
wookieb
post
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 (IMG:style_emoticons/default/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  « < 5 6 7 8 9 > »   
Start new topic
Odpowiedzi (120 - 139)
wookieb
post
Post #121





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




Wystarczy dodać katalog z BbCode do include_path (IMG:style_emoticons/default/snitch.gif)
Go to the top of the page
+Quote Post
Zajec
post
Post #122





Grupa: Zarejestrowani
Postów: 1 086
Pomógł: 8
Dołączył: 10.12.2003

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


Cytat(wookieb @ 3.03.2011, 22:11:02 ) *
Wystarczy dodać katalog z BbCode do include_path (IMG:style_emoticons/default/snitch.gif)
Pewnie, tylko wyboraź sobie takie include_path ze wszystkimi projektami.
Kod
.;include/tools/parsers/BbCode/;include/tools/parsers/Wiki/;include/tools/PHPTAL/;include/tools/Sblam/
Ogłupiałbym (IMG:style_emoticons/default/tongue.gif)

Poza tym nie chodzi mi o to, abym ja sobie z tym poradził. Uważam projekt za ciekawy i chciałem, aby każdemu nowemu jego użytkownikowi działało to out-of-box.

Ten post edytował Zajec 8.03.2011, 12:57:59
Go to the top of the page
+Quote Post
gorzat
post
Post #123





Grupa: Zarejestrowani
Postów: 23
Pomógł: 3
Dołączył: 18.03.2011

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


witam, sciagnalem sobie to, ale nie bardzo wiem jak sie teraz do tego zabrac...
mam sobie strony index.php oraz dodaj.php, na tym samym poziomie folder bbcode.
no i co teraz musze zrobic, zebym w formularzu dodaj.php mogl sobie wpisac tekst i ubrac go w bbcode?
dodaje do plikow
  1. include_once('Bbcode/BbCode.class.php');
  2. $bb=new BbCode();


i co dalej? co mam zrobic, zebym mogl wpisac test i mi sie to w index.php wyswietlilo pogrubione?
poza tym wyskakuje mi blad
Kod
Warning: include_once(Bbcode/Filters/Youtube.php) [function.include-once]: failed to open stream: No such file or directory in E:\wamp\test\templates\bbcode\BbCode.class.php on line 264

Warning: include_once() [function.include]: Failed opening 'Bbcode/Filters/Youtube.php' for inclusion (include_path='.;C:\php5\pear') in E:\wamp\test\templates\bbcode\BbCode.class.php on line 264

w php.ini znalazlem i odznaczylem
Cytat
Windows: "\path1;\path2"
include_path = ".;c:\php\includes;E:\wamp\www\test\Bbcode\"

ale to nic nie dalo ;/ prosze o pomoc
Go to the top of the page
+Quote Post
Avatarus
post
Post #124





Grupa: Zarejestrowani
Postów: 304
Pomógł: 0
Dołączył: 12.12.2006
Skąd: Pszów

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


a jak zrobić zwykłe prasowanie
Kod
<br />

W smf bbcode i html jest mieszane podczas zapisu.
Dzięki za pomoc
Go to the top of the page
+Quote Post
wookieb
post
Post #125





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




Musisz wcześniej zamienić "<br />" na znak nowej linii.
Go to the top of the page
+Quote Post
mlawnik
post
Post #126





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

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


A czy jest możliwość parsowania youtube po samym ID?
@gorzat, użyj patcha Zajeca
Go to the top of the page
+Quote Post
wookieb
post
Post #127





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




Tak. W tagu podajesz po prostu tylko jego ID
Go to the top of the page
+Quote Post
mlawnik
post
Post #128





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

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


No ale jak podaje samo id to mi sie wyswietla ramka z youtubem i tekstem, ze not found.
Fakt, uzylem patcha zejeca i zmienilem player na nowy.
Mozesz pomoc?

Moj kod:

github.com/marcinlawnik/BBcode-parser
Go to the top of the page
+Quote Post
wookieb
post
Post #129





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




Jestem kretynem. Mój błąd
W pliku Filter/Youtube.php
zamień linijke
  1. $idMovie = htmlspecialchars($str);

na
  1. $idMovie = htmlspecialchars($bodyStr);

Ja też to potem wrzucę na githuba.
Go to the top of the page
+Quote Post
mlawnik
post
Post #130





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

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


Poprawione.

Zaraz dorzuce twoje przyklady i zrobie diff na twoim oryginale i mojej modyfikacji.

Ew. po prostu zrobisz forka z mojej wersji.
Go to the top of the page
+Quote Post
wookieb
post
Post #131





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




Raczej nie forka. I tak będę wydawał nową wersję.
Go to the top of the page
+Quote Post
mlawnik
post
Post #132





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

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


Czekam z nieciepliwością.

EDIT: Dla potomnych:

Zawartosc paczki z pierwszego postu:

GitHub

Paczka z pierwszego postu z modyfikacjami:
- patch zajeca
- poprawka w youtube.php taka sama jak w patchu bo zajec ja pominal
- poprawka 2 posty wyzej z $str i $bodyStr

GitHub



Ten post edytował mlawnik 10.04.2011, 19:46:46
Go to the top of the page
+Quote Post
nekomata
post
Post #133





Grupa: Zarejestrowani
Postów: 314
Pomógł: 44
Dołączył: 12.11.2010
Skąd: UK

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


Jedna rzecz , czy parser blokuję html'a i XSS czy to już należy do nas?
Go to the top of the page
+Quote Post
wookieb
post
Post #134





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




Sam blokuje.
Go to the top of the page
+Quote Post
nekomata
post
Post #135





Grupa: Zarejestrowani
Postów: 314
Pomógł: 44
Dołączył: 12.11.2010
Skąd: UK

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


Dzięki , zaoszczędzi mi to trochę włosów na głowie (IMG:style_emoticons/default/tongue.gif) ogólnie świetna sprawa.Myślałeś może o dodaniu tagu "spoiler"?
Go to the top of the page
+Quote Post
wookieb
post
Post #136





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




Nie planuje, bo jest to zbyt zależne od widoku.
Go to the top of the page
+Quote Post
nekomata
post
Post #137





Grupa: Zarejestrowani
Postów: 314
Pomógł: 44
Dołączył: 12.11.2010
Skąd: UK

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


W sumie dzięki takiemu łatwemu do zrozumienia rozpisaniu klasy bardzo łatwo dopisywać tagi. Jakby ktoś chciał tag spoiler z jQuery to ja zrobiłem to tak :
Zaraz po tag'u Quote w pliku Basic.php
  1. ,
  2. 'spoiler'=>array(
  3. 'open'=>'div class="spoiler"><input type="button" value="Spoiler"/><div class="spoiled"',
  4. 'close'=>'div></div'
  5. )
CSS :
  1. .spoiler , .spoiler input {
  2. margin:5px;
  3. border: 1px white dashed;
  4. }
  5. div.spoiler div.spoiled{
  6. display:none;
  7. margin:5px;
  8. }
i w JS
[JAVASCRIPT] pobierz, plaintext
  1. $('.spoiler').children('input').click(function(){
  2. $(this).siblings('.spoiled').toggle();
  3. });
[JAVASCRIPT] pobierz, plaintext
A tak ogólnie mówiąc to ja taki parser bym sprzedawał a nie publikował .. (IMG:style_emoticons/default/biggrin.gif)
EDIT : Pozwoliłem sobie otworzyć tagi spowrotem (IMG:style_emoticons/default/tongue.gif) Ponieważ "domykają" się one w linijce 670,695 i 790 pliku BbCode.class.php (IMG:style_emoticons/default/tongue.gif)

Ten post edytował nekomata 13.04.2011, 19:26:41
Powód edycji: [wookieb]: Pozwoliłem sobie domknąć Ci tagi html
Go to the top of the page
+Quote Post
szczeku
post
Post #138





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 29.08.2010

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


Cześć,

Na początek napisze, że świetny parser stworzyłeś.

Ale mam dwie kwestie.

1. Zagnieżdzanie tagów, np:

  1. [b]123[/b]

zamienia na:
  1. <b><b>123</b></b>

zamiast na:
  1. <b>123</b>


pomimo iż w filtrze taga 'b' jest :
  1. 'notallowed_child'=>array('b')


inne tagi usuwa, jeśli się je poda jako niedozwolone

2. Chciałbym zrobić tak, żeby nie domykało tagów np. gdy zapomni się napisać [/quote] , to żeby nie robiło cytowania, teraz cytatem jest objęte wszystko do końca. Czy jest jakiś sposób aby tak się działo (a raczej nie działo (IMG:style_emoticons/default/smile.gif) ).

pozdrawiam
Go to the top of the page
+Quote Post
nekomata
post
Post #139





Grupa: Zarejestrowani
Postów: 314
Pomógł: 44
Dołączył: 12.11.2010
Skąd: UK

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


@mlawnik popraw tag youtube'a dokładnie mam na myśli linijkę 77 , usuń "allowfullscreen" bo w3c validator krzyczy a nic to allowfullscreen niezmienia bo to nie jest embed tylko iframe.
Go to the top of the page
+Quote Post
wookieb
post
Post #140





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




1) Tak zajmę się tym
2) Niestety raczej nie ma takiej opcji ale racja muszę o tym pomyśleć.
Go to the top of the page
+Quote Post

12 Stron V  « < 5 6 7 8 9 > » 
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: 22.08.2025 - 22:14