Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa] Zaawansowany parser bbcode (php5)
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
Stron: 1, 2, 3, 4, 5
boro11
Witam!
Od jakiegoś czasu używam Twojego parsera i jestem z niego bardzo zadowolony, ale mam jeden problem.

Podczas kopiowania tekstu zachowuje się jego formatowanie np. tekst:
Cytat
Hello Vic!
Website status is updated during refback adding so just wait till we get payment from that website. Your clicks is counted even if your status is "Pending" so don't worry you will be paid for each click you made.

Thank you for choosing RefbackBank.com and have a wonderful day. If you have any questions, please contact us at any time.

Best regards,
Boro
https://www.refbackbank.com


Skopiowałem ze swojego sytemu helpdesk, po wklejeniu na forum otrzymałem:

Cytat
Hello Vic!
[*font="Verdana Geneva Arial Helvetica sans-serif"]Website status is updated during refback adding so just wait till we get payment from that website. Your clicks is counted even if your status is \"Pending\" so don\'t worry you will be paid for each click you made.[/font]

[*font="Verdana Geneva Arial Helvetica sans-serif"]Thank you for choosing RefbackBank.com and have a wonderful day. If you have any questions, please contact us at any time. [/font]

[*font="Verdana Geneva Arial Helvetica sans-serif"]Best regards, [/font]
[*font="Verdana Geneva Arial Helvetica sans-serif"]Boro[/font]
[*font="Verdana Geneva Arial Helvetica sans-serif"]https://www.refbackbank.com[/font]


Poszukałem trochę i znalazłem opcje $removeInvalidTags - która jest domyślnie ustawiona na true ( i jest tak u mnie) co powinno zlikwidować problem tagów które nie istnieją, jednak mimo wszystko pojawiają się one. Co można zrobić żeby temu zaradzić zakładając, że nie chce dać możliwości zmiany czcionki użytkownikom?


Ps. Oczywiście znaków * nie ma, ale je dodałem bo to forum tego problemu nie ma jak się okazuję i zmienia na inne fonty smile.gif
wookieb
Faktycznie był mały błąd w parserze. Poprawione - wersja na githubie smile.gif
boro11
Teraz działa idealnie dziękuję smile.gif
Lirdoner
Witam, chciałbym aby jeżeli tekst odnośnika do strony jest dłuższy niż 100 znaków to pojawiały się tylko 20 pierwszych znaków, następnie ... i końcowe 20 znaków.
Jak to zmienić w parserze?
wookieb
https://github.com/wookieb/bbcode/blob/mast...Filters/Url.php
Metoda shortUrl
benzulli
Witam,

Jak mogę to umieścić na swojej stronie? Chciałbym tak zrobić, żeby można było bbcode używać przy dodawaniu newsa, już cały skrypt gotowy, tylko jak to tam wsadzić?
wookieb
Musisz zastosować parser bbcode przy zapisie aby zastąpić oryginalną treść newsa treścią z parsera. Przykład jak wykorzystać parser jest podany na 1 stronie tematu oraz w repozytorium.
benzulli
  1. <form action="" method="post">
  2. <select name="id_profesji">
  3. <?php
  4. include("polacz.php");
  5. $results = mysql_query("SELECT id, profesja FROM profesje");
  6. while($id_profesji = mysql_fetch_array($results))
  7. {
  8. ?>
  9. <option value="<?php echo $id_profesji[0]; ?>">
  10. <?php echo $id_profesji[1]; ?>
  11. </option>
  12. <?php
  13. }
  14. ?>
  15. </select><br />
  16. Tytuł<br />
  17. <input type="text" name="tytul" /><br />
  18. Level:<br />
  19. <input type="text" name="level" /><br />
  20. Wersja:<br />
  21. <input type="text" name="version" /><br />
  22. Ostatnia aktualizacja: <br />
  23. <input type="text" name="last_update" /><br />
  24. Video: <br />
  25. <input type="text" name="video" /><br />
  26. Treść: <br />
  27. <textarea name="tresc"></textarea>
  28. <input type="submit" value="Dodaj" />
  29. </form>
  30. <?php
  31. $tytul = $_POST['tytul'];
  32. $level = $_POST['level'];
  33. $version = $_POST['version'];
  34. $last_update = $_POST['last_update'];
  35. $video = $_POST['video'];
  36. $id_profesji = (int)$_POST['id_profesji'];
  37. $tresc = $_POST['tresc'];
  38. if($_SERVER['REQUEST_METHOD'] == 'POST')
  39. {
  40. $query = mysql_query("INSERT INTO skrypty SET tytul='$tytul', level='$level', version='$version', last_update='$last_update', video='$video', id_profesji='$id_profesji', tresc='$tresc'");
  41. if($query) echo "Poradnik został dodany poprawnie";
  42. else echo "Błąd, nie udało się dodać nowego poradnika";
  43. }
  44. ?>


Mam taki kod, on jest odpowiedzialny za dodanie nowego newsa. Pytam bo nie wiem, czytam już trzeci raz i nie wiem co i jak do czego. Mam po prostu zaincludować na samą górę plik bbcode.php?
wookieb
Najpierw naucz się programować. Koniec dyskusji.
benzulli
Witam, poradziłem sobie z tym już jakiś czas temu, lecz teraz tak naprawdę zacząłem używać tabeli. Firebug w ogóle nic nie wykazuje, usunąłem cały styl pliku i nadal występuje błąd: nad tabelą pozostaje jakies 500-600px wolnego miejsca. Próbowałem to zmienić margin-top:-500px, ale jest to rozwiązanie niestabilne, bo czasami tabela rozszerza się na większą odległość.

Dodałem to do basic.php

  1. 'table' => array(
  2. 'open' => 'table',
  3. 'close' => 'table',
  4. 'notallowed_child' => array('table')
  5. ),
  6. 'tr' => array(
  7. 'open' => 'tr',
  8. 'close' => 'tr',
  9. 'notallowed_child' => array('tr')
  10. ),
  11. 'td' => array(
  12. 'open' => 'td',
  13. 'close' => 'td',
  14. 'notallowed_child' => array('td')
  15. ),


A taką formę ma mój kod html, który jest potem parsowany:

  1. [table]
  2. [tr]
  3. [td]asdasdas[/td]
  4. [td]adadasdas[/td]
  5. [td]asdasteretrr34[/td]
  6. [/tr]
  7. [tr]
  8. [td]3333[/td]
  9. [td]sawe[/td]
  10. [td]asaa[/td]
  11. [/tr]
  12. [/table]
  13.  


Kiedy dodam tabelkę bez zdjęć odstęp od góry też występuje.
com
pokaż to na przykładzie, bo wrzuciłeś jakieś fragmenty które niczego nie obrazują.. najlepiej link albo jsfiddle
benzulli
  1. blablablablabla 1231231313123123123 test
  2. <?php
  3. require_once 'Bbcode/BbCode.php';
  4. $tresc = '[table]
  5. [tr]
  6. [td]asdasdas[/td]
  7. [td]adadasdas[/td]
  8. [td]asdasteretrr34[/td]
  9. [/tr]
  10. [tr]
  11. [td]3333[/td]
  12. [td]sawe[/td]
  13. [td]asaa[/td]
  14. [/tr]
  15. [/table]';
  16. $parser = new BbCode();
  17. echo $parser->parse($tresc); ?>
  18. blablablablabla 1231231313123123123 test


http://renzulli.linuxpl.info/images/parser.php

Tutaj akurat nie ma zbytnio dużego odstępu, jedynie 230px, ale jeśli dam więcej kodu to wtedy występują większe odstępy - nie mam pojęcia dlaczego.
com
Źródło prawdę Ci powie, nwm co to za parser ale coś w nim jest nie tak wink.gif
  1. blablablablabla 1231231313123123123 test
  2. <table><br />
  3. <tr><br />
  4. <td>asdasdas</td><br />
  5. <td>adadasdas</td><br />
  6. <td>asdasteretrr34</td><br />
  7. </tr><br />
  8. <tr><br />
  9. <td>3333</td><br />
  10. <td>sawe</td><br />
  11. <td>asaa</td><br />
  12. </tr><br />
  13. </table>blablablablabla 1231231313123123123 test
benzulli
Wiem co jest nie tak - po prostu każde przeniesienie do nowej linijki to <br />. Zatem będę musiał tabelki pisać bez przeniesień do nowych linijek.
com
tak ale wgl poco Ci to br tu? przecież jego to się rzadko w obecnych czasach używa do łamana tekstu, akapity wyznaczasz znacznikiem <p>, a br to ostateczność..
benzulli
Właśnie go nie chcę, a to jest w parserze ustawione, że po złamaniu linii w bbcode dodaje <br>. Ja dodałem bbcode tabeli ręcznie. Chciałbym się tego pozbyć.
com
no to warunkiem sprawdzaj czy jesteś w tabeli jeśli tak no to nie dodajesz br jeśli nie no to tak jak było wink.gif

albo stwórz oddzielna metodę do generowana tabelek najlepiej wink.gif
benzulli
Dzięki, po prostu zastosuję preg_replace do tych 6 znaków i po problemie.

@edit
Niestety, po zastosowaniu preg_replace dalej występuje ten błąd. Wgrywałem inne parsery, ale część nie ma tabelek, a w innych to same błędy wyskakują.
pionas
I ja podepnę się do tematu..

ckeditor z wtyczką bbcode tworzy list na takiej zasadzie:
[_list=1]
[_*]Aaaaaaaa
[_*]Bbbbbbbb
[_*]Ccccccccc
[_/list]
(jeśli ma być numerowane)

lub wypunktowanie
[_list]
[_*]Aaaaaaaa
[_*]Bbbbbbbb
[_*]Ccccccccc
[_/list]
jak to dostosować do dodatku List.php?

Dodałem _ bo tutaj działa takie parsowanie...
sazian
kiedyś przerabiałem ten problem z listami
może komuś się przyda https://www.dropbox.com/s/n9ti8d57mgr0ly3/plugin.js?dl=1 teraz ck będzie zamykał tagi w listach, nie pamiętam co tam zmieniałem żeby działało więc musicie szukać sami smile.gif
wydaje mi się chodzi o to
Kod
this.setRules('*', {
                        breakBeforeOpen: 1,
                        breakAfterOpen: 0,
                        breakBeforeClose: 0,
                        breakAfterClose: 1
                    });

ale pewności nie mam
szajens
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
boro11
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
Forti
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
wookieb
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
Forti
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/
wookieb
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
pionas
Hej,

po aktualizacji PHP do 5.4.38 parser nie działa.
Wiecie czemu tak się dzieje?
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-2025 Invision Power Services, Inc.