Ha egyszer valaki előveszi a most készülő fórum motorom forráskódját, és belenéz a BBCode parser osztályba, akkor két publikus függvényt fog látni. Az egyik az, amit meg kell hívni, hogy egy formázott üzenetből HTML kód legyen, a másik fejkommentje pedig közli, hogy nem szabad meghívni. Miért nem privát akkor? Lássuk… Most hirtelenjében kétféle módot tudok mondani, hogy egy parser-t hogyan lehet megírni. Van egy nulladik is, de azt gyorsan el is vetem: egyszerűen str_replace() függvénnyel csereberélni a tag-eket. Ezzel hatalmas probléma, hogy a paraméteres tag-eket nem lehet feldolgozni. Oké, akkor a feledik megoldás az, hogy preg_replace(‘/\[[color=([0-9a-fA-F]{3,6})\](.*?)\[/color\]/s’, ‘<span style=”color:#${1}”>${2}</span>’, $text). Szuper, mindent megold! Őőőő. Majdnem. Ugyanis nem minden tag értelmezett mindenhol. (Pl: két egymásba ágyazott [b] az baromság, és a [li] tag-et sem értelmezzük [ul] vagy [ol] tag-en kívül.) Persze lehet mondani, hogy hibás kódot is meg tudja enni valahogy, és ne legyen hülye a user, ne írjon ilyet, de ez nem a legszerencsésebb megoldás… Akkor az első értelmes megoldás az állapotgép, mindenki kedvence. A parser talál egy [img] tag-et, és akkor tudja, hogy egész addig minden a kép URL-jéhez tartozik, amíg nem talál egy [/img]-t. Ez nekem annyira nem tetszett, persze ez szubjektív, hogy melyik tetszik és melyik nem két egyforma eredményt nyújtó kódból. A másik járható út egy rekurzív feldolgozás. Tankörtársam szerint csak azért választottam ezt, mert meghallgattam a deklaratív programozás tárgyat. 😀 preg_replace_callback( "/$pattern/s", function($m) use ($parents) { return self::replaceSingleTag($m, $parents); }, $text ); Ez azt tudja, hogy a függvény lokális $parents változóját elérhetővé teszi a labda függvény belsejében is, és ott meghívja a két paraméterrel a privát statikus metódust. Nice, gj, wp. 5.2 Ebben a verzióban még nincs lambda se! Sebaj, még mindig van preg_replace(“/$pattern/se“, ‘osztály::metódus($1,$2,…,$6,$parents);’, $text), és create_function() is. Per se ettől még nem lesz jó a scope, és publikussá kell tenni a függvényt, és ha valaki elolvassa a vonatkozó dokumentációt, és ránéz a 7 paraméterre, akkor rájön, hogy ez annnnnnyira nem is jó ötlet, a create_function meg legalább annyira átlátható, mint a szoftlab 5 java sablon. És ezt az utat bejárva jutott el a kód oda, hogy a fent vázolt szexi megoldást lecseréltem egy privát statikus stack-re az osztályban, és a callback függvény publikus, csak nem akar szóbaállni senkivel. |
There's no response yet to this post. You can leave yours at the bottom of the page. Pinging is currently not allowed. | ||