ugrás a tartalomhoz

Érvénytelen bbcode kezelés és quote egymásba ágyazás

Anonymous · 2006. Május. 21. (V), 19.50
Lenne két kérdésem a BBCode használatával kapcsolatban:

1. Ti hogyan kezelitek azt le, hogyha például a felhasználó előbb zárja le a [ b]-tagot mint ahogy kéne. Pl: [ b]félkövér betűs [ i]és dőlt betűs szöveg[ /b][ /i] Biztos lesz olyan felhasználó aki el fogja rontani, és így e miatt nem lesz valid az oldal.

2. Ha egymásnak válaszolnak a felhasználók, akkor a választ egy [ quote] tagba teszem a választ. Viszont ha egy olyan üzenetre válaszolnak amiben már van egy ilyen válasz, és így egymásbaágyazódnak a [ quote] tagok, akkor már nem működik helyesen. Pl: [ quote][ quote]válasz-1[ /quote]válasz-2[ /quote]
Így a szkript az első nyitó és első záró tagot veszi válasz-idézetnek, és nem fogja őket egymásbaágyazni.

Ezeket hogyan lehetne megoldani?
 
1

Idézés

Anonymous · 2006. Május. 21. (V), 19.52
Közbe rögtön eszembe jutott az, hogyha még a beszúrás előtt átalakítom a BBCode tageket, akkor a 2. probléma elvileg nem jelenthetne gondot. Mindjárt ki is próbálom így van-e.
2

Téves

Anonymous · 2006. Május. 21. (V), 20.01
Így meg a htmlspecialchars kavar be, úgyhogy azt hiszem ez sem járható út.
3

valid

winston · 2006. Május. 21. (V), 20.17
eléggé öncélú lett a topic :)

quote: hát az attól függ, hogy-hogy oldod meg a quotet... mert ugye sok féle képp lehet
validság: egyszerűen ráeresztesz egy olyan fv.-t, ami ellenőrzi, hogy minden nyitótag után az a zárótag jön e. pl.: csinálsz egy tömböt. első elemnek felveszed az első tagot, pl. félkövér, aztán az utána levő megnyitó tagot, pl. dőlt. ha meg bezárni kell, egyszerűen megnézed, hogy a tömb uccsó elemének típusa megegyezik e a bezáró taggel. persze ezzel még nem kezelted le. ez egy egyszerűbb mód, de még számtalan másik megoldás is van. have a nice day.
4

függvényem

Raziel Anarki · 2006. Május. 21. (V), 22.26
pont jókor jött ez a téma, én is épp a bbcode rejtelmeit kutatom :)

én ezt az egyszerű függvényt használom bbcode kezelésére. a lényege h kííratáskor futtatom keresztül rajta a kommenteket.

bepostolom, hátha valakinek hasznára válik, meg így legalább rá tudtok mutatni az én hibáimra is :)

a tagek helyes egymásbaágyazási sorrendje itt is a júzertől függ, de azt hiszem az idézeteket kezeli

a listákkal van egy kis gond (elemek, számozás validság), tudtok erre valami ötletet adni?

ti mit csinálnátok másképpen?
  1. function parse_bbcode ($text)  
  2. {  
  3.     $tags ['b'] =          array ('open' => '<span style="font-weight: bold">',  
  4.                                 'close' => '</span>');  
  5.   
  6.     $tags ['i'] =          array ('open' => '<span style="font-style: italic">',  
  7.                                 'close' => '</span>');  
  8.   
  9.     $tags ['u'] =          array ('open' => '<span style="text-decoration: underline">',  
  10.                                 'close' => '</span>');  
  11.   
  12.     $tags ['size=(.*)'] =  array ('open' => '<span style="font-size: ',  
  13.                                 'close' => 'px">\\2</span>');  
  14.   
  15.     $tags ['color=(.*)'] = array ('open' => '<span style="color: ',  
  16.                                 'close' => '">\\2</span>');  
  17.   
  18.     $tags ['url'] =        array ('open' => '<a rel="external" href="',  
  19.                                 'close' => '">\\1</a>');  
  20.   
  21.     $tags ['url=(.*)'] =   array ('open' => '<a rel="external" href="',  
  22.                                 'close' => '">\\2</a>');  
  23.   
  24.     $tags ['email'] =      array ('open' => '<a href="mailto:',  
  25.                                 'close' => '">\\1</a>');  
  26.   
  27.     $tags ['email=(.*)'] = array ('open' => '<a href="mailto:',  
  28.                                 'close' => '">\\2</a>');  
  29.   
  30.     $tags ['img'] =        array ('open' => '<img src="',  
  31.                                 'close' => '" alt="kép" />');  
  32.                                   
  33.     $tags ['center'] =     array ('open' => '<span class="center">',  
  34.                                 'close' => '</span>');  
  35.   
  36.     $tags ['list'] =       array ('open' => '<ul>',  
  37.                                 'close' => '</ul>');  
  38.   
  39.     //FIXME: is this XHTML?? (ol:type)  
  40.     $tags ['list=(.*)'] =  array ('open' => '<ol type="',  
  41.                                 'close' => '">\\2</ol>');  
  42.   
  43.     $tags ['quote'] =      array ('open' => '<q>',  
  44.                                 'close' => '</q>');  
  45.   
  46.     $tags ['quote=(.*)'] = array ('open' => '<br /><strong>',  
  47.                                 'close' => ' írta</strong>:<br /><q>\\2</q>');  
  48.   
  49.    //FIXME: not valid XHTML - bbcode doesnt close [*] list items  
  50.     $stags ['\*'] = '<li>';  
  51.   
  52.     foreach ($tags as $name => $replace)  
  53.     {  
  54.         $end = preg_replace('/\W/Usi'''$name);  
  55.         $text = preg_replace('|\[' . $name . '\](.*)\[/' . $end . '\]|Usi'$replace['open'] . '\\1' . $replace['close'], $text);  
  56.     }  
  57.   
  58.     foreach ($stags as $name => $replace)  
  59.     {  
  60.         $text = preg_replace ('|\[' . $name . '\]|Usi'$replace$text);  
  61.     }  
  62.   
  63.     return $text;  
  64. }  
5

Ezz...

-zsolti- · 2006. Május. 21. (V), 22.39
Nem tudom/akarom most kipróbálni, de esetleg nincs valami adatod róla, hogy kb. hány százalékkal növeli meg az oldagenerálás idejét ez a függvény, ha kiíráskor használod? Csak érdekel.
6

sajnos nincs... de megnéztem

Raziel Anarki · 2006. Május. 21. (V), 22.50
sajnos nincs, ugyanis nem igazán szoktam mérni az oldalgenerálásokat, nem igazán dolgozom olyan környezetben ahol ez számítana (hobbiprogramozó vagyok)

de szerintem most meg fogom nézni :)

szerk: megnéztem, a weboldalam főoldalának legenerálása (10 darab ilyen módon formázott bejegyzéssel, amik nem is túl hosszúak)

0.0825 másdopercről 0.0907 másodpercre nőtt (~0.0082 mp)

mivel nem igazán tudom hova tenni a számokat, jól sejtem h ez számít?

valószínűleg a preg_replace hosszabb stringeknél jóval lassabb is lehet.

hogyan oldják ezt meg a nagyok?

első ötletnek az "adatbázisba mentéskor" ugrik be...

szerk2:
további tesztelés azt mutatja, h a generálási idő föggvény nélkül is 0.082 és 0.097 között mozog (leggyakrabban 0.086), föggvénnyel pedig 0.087 és 0.101 között (leggyakrabban 0.094)
7

regexp hiba

Anonymous · 2006. Május. 24. (Sze), 16.32
Közbe kiderült hogy semmilyen egymásbaágyazott BBCode nem működik (pl: [ b] b [ b] b [ /b] b [/b], viszont ha többször hívom meg azt a függvényt ami a preg_replace segítségével átalakítja a kódokat html tag formájába, akkor működik. Arra gyanakszom, hogy a regexp kifejezés nem megfelelő amit használok: (.*?)
Viszont akkor mit használjak e helyett?
8

Ötlet...

Anonymous · 2006. Május. 25. (Cs), 17.12
A ? helyett próbáltad a + jelet, vagy a többi ilyen "módosítót"?

Károly