Napisałem do swojego cmsu na szybko wtyczkę która w formie jsona trzyma do każdego tagu BB 2 regexy (z => do) oraz informację czy tagu może używać zwykły użytkownik (np. w komentarzach).
Kod odpowiedzialny za aplikowanie BB jest bardzo prosty:
private function parseBB($txt, $onlySafeTags=true) { foreach($this->sets as $preg) { if($onlySafeTags == true && $preg[2] != "1") continue; //Only safe tags mode turned on but processed tag is not safe, skip it if($out==false) trigger_error("BBCoder: tag ==> ".$preg[0]." <== is broken", E_USER_WARNING); else $txt = $out; //Do not destory text on error } return $txt; }
Życie nauczyło mnie, że im prostrzy dla człowieka kod tym dłużej się wykonuje - nie inaczej jest tutaj. Przy 2-3 tagach nie ma problemu, jadnak jeśli dodam ich 20 to czas generowania przestaje być satysfakcjonujący. Prasowanie 1 tagu zajmuje średnio 0.8-1ms przy C2D - to wartość dla mnie nieakceptowalna.
Co prawda aplikowanie działa tak, że podstrona jest generowana > aplikowane są filtry (jednym z nich jest właśnie wtyczka BBCoder) > podstrona jest cachowana jako wynikowy HTML jednakże nie podoba mi się sytuacja gdy głupie BBCode dubluje czas generowania.
Czy ktoś ma pomysł jak to rozwiązanie uwydajnić? Mógłbym bawić się w str_replace ale wtedy odpadają tagi z parametrami (np. [yt width=100 height=100][/yt]) oraz powstaje problem niedomkniętych tagów.