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?
function parse_bbcode ($text)
{
	$tags ['b'] =          array ('open' => '<span style="font-weight: bold">',
                                'close' => '</span>');

	$tags ['i'] =          array ('open' => '<span style="font-style: italic">',
                                'close' => '</span>');

	$tags ['u'] =          array ('open' => '<span style="text-decoration: underline">',
                                'close' => '</span>');

	$tags ['size=(.*)'] =  array ('open' => '<span style="font-size: ',
                                'close' => 'px">\\2</span>');

	$tags ['color=(.*)'] = array ('open' => '<span style="color: ',
                                'close' => '">\\2</span>');

	$tags ['url'] =        array ('open' => '<a rel="external" href="',
                                'close' => '">\\1</a>');

	$tags ['url=(.*)'] =   array ('open' => '<a rel="external" href="',
                                'close' => '">\\2</a>');

	$tags ['email'] =      array ('open' => '<a href="mailto:',
                                'close' => '">\\1</a>');

	$tags ['email=(.*)'] = array ('open' => '<a href="mailto:',
                                'close' => '">\\2</a>');

	$tags ['img'] =        array ('open' => '<img src="',
                                'close' => '" alt="kép" />');
                                
	$tags ['center'] =     array ('open' => '<span class="center">',
                                'close' => '</span>');

	$tags ['list'] =       array ('open' => '<ul>',
                                'close' => '</ul>');

    //FIXME: is this XHTML?? (ol:type)
	$tags ['list=(.*)'] =  array ('open' => '<ol type="',
                                'close' => '">\\2</ol>');

	$tags ['quote'] =      array ('open' => '<q>',
                                'close' => '</q>');

	$tags ['quote=(.*)'] = array ('open' => '<br /><strong>',
                                'close' => ' írta</strong>:<br /><q>\\2</q>');

   //FIXME: not valid XHTML - bbcode doesnt close [*] list items
	$stags ['\*'] = '<li>';

	foreach ($tags as $name => $replace)
	{
		$end = preg_replace('/\W/Usi', '', $name);
		$text = preg_replace('|\[' . $name . '\](.*)\[/' . $end . '\]|Usi', $replace['open'] . '\\1' . $replace['close'], $text);
	}

	foreach ($stags as $name => $replace)
	{
		$text = preg_replace ('|\[' . $name . '\]|Usi', $replace, $text);
	}

	return $text;
}
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