Ik ben zojuist bezig gegaan aan een UBB parser. Deze leek te werken, alleen helaas, dat doet hij toch niet. Relevante stukken code:
Wat is nu de bedoeling: ik wil kunnen controleren of de ingevoerde waarde wel een waarde is die ook mag. Om zaken als javascript-injections ed. te voorkomen dus. Waarom werkt het niet? De uitvoer is als volgt:
En let dan goed op het aanhalingstekentje voor de 36 en het ontbreken ervan achter de 36, terwijl de preg_replace toch duidelijk aangeeft dat erachter nog een " moet staan, en ervoor zou moeten worden uitgefiltert door het aanroepen van parse_filter_ubb. Ik heb er uiteraard aan gedacht om het hele <span> gedeelte te returnen, ik wil de boel echter zo universeel mogelijk houden. Ook heb ik al eindeloos rondgespeelt met aanhalingstekens, echter kom ik er gewoon niet uit... Wie durft?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| public function parse_msg($message) { $this->ubb_in_cache = array( "/\[color=(.+?)\](.+?)\\[\/color\]/is", "/\[size=(.+?)\](.+?)\\[\/size\]/isuS"); $this->ubb_out_cache = array( '<span style="color: \1;">\2</span>', '<span style="font-size: '.self::parse_filter_ubb('"\\1"',"num",12).';">\2</span>'); $message = preg_replace($this->ubb_in_cache, $this->ubb_out_cache ,$message); return $message; } [...] private function parse_filter_ubb($value,$type,$default) { if($type == "num") { // strip aanhalingstekentjes $value = preg_replace("/\"/is",'',$value); //check of de waarde wel numeriek is if(preg_match("/~[0-9]/is",$value)) return $default; else return $value; } } [...] $message = 'Teksterde TEKST!!! [color=#ff0000]Tekst ja[/color] jaha, [size="36"]tekst![/size]'; $parse = new parse; echo $parse->parse_msg($message); |
Wat is nu de bedoeling: ik wil kunnen controleren of de ingevoerde waarde wel een waarde is die ook mag. Om zaken als javascript-injections ed. te voorkomen dus. Waarom werkt het niet? De uitvoer is als volgt:
HTML:
1
| Teksterde TEKST!!! <span style="color: #ff0000;">Tekst ja</span> jaha, <span style="font-size: "36;>tekst!</span> |
En let dan goed op het aanhalingstekentje voor de 36 en het ontbreken ervan achter de 36, terwijl de preg_replace toch duidelijk aangeeft dat erachter nog een " moet staan, en ervoor zou moeten worden uitgefiltert door het aanroepen van parse_filter_ubb. Ik heb er uiteraard aan gedacht om het hele <span> gedeelte te returnen, ik wil de boel echter zo universeel mogelijk houden. Ook heb ik al eindeloos rondgespeelt met aanhalingstekens, echter kom ik er gewoon niet uit... Wie durft?
[ Voor 20% gewijzigd door RSpliet op 21-12-2004 15:52 ]
Schaadt het niet, dan baat het niet