[php5] preg_replace met functie, foute uitvoer

Pagina: 1
Acties:

  • RSpliet
  • Registratie: Juni 2003
  • Laatst online: 27-11-2025
Ik ben zojuist bezig gegaan aan een UBB parser. Deze leek te werken, alleen helaas, dat doet hij toch niet. Relevante stukken code:
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


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

Waarschijnlijk geen oplossing, maar je doet nogal rare dingen. Om te beginnen de preg_match op regel 17, waar je geen rekening lijkt te houden met getallen die langer zijn de 1 teken. Bovendien is het nogal vreemd om voor niet-alfanumerieke waarden de case insensitivity modifier (i) te gebruiken. Verder kun je de preg_replace op regel 15 beter vervangen door een str_replace, waarbij je beter ook rekening kan houden met enkele quotes. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 23:35

crisp

Devver

Pixelated

* crisp mompelt iets over een e-modifier...

Intentionally left blank


  • RSpliet
  • Registratie: Juni 2003
  • Laatst online: 27-11-2025
-NMe- schreef op dinsdag 21 december 2004 @ 16:29:
Waarschijnlijk geen oplossing, maar je doet nogal rare dingen. Om te beginnen de preg_match op regel 17, waar je geen rekening lijkt te houden met getallen die langer zijn de 1 teken. Bovendien is het nogal vreemd om voor niet-alfanumerieke waarden de case insensitivity modifier (i) te gebruiken. Verder kun je de preg_replace op regel 15 beter vervangen door een str_replace, waarbij je beter ook rekening kan houden met enkele quotes. ;)
Die i is eigenlijk automatisme, maar ik zoek dus met die preg_match naar tekens die NIET in de 0-9 reeks zitten, vandaar dat golfje ook. Die getallen kunnen zo lang zijn als je zelf wilt, het gaat om een teken die niet in de ~[0-9] reeks zit, eentje is nl. al teveel ;).
Regel 15 was oorspronkelijk ook een str_replace, maar ik zocht een verklaring voor mijn probleem, en wist dus bij god niet waar...
crisp schreef op dinsdag 21 december 2004 @ 16:32:
* crisp mompelt iets over een e-modifier...
Kijk, jij mag van mij vaker mompelen, tnx :) Volgende keer toch maar eens niet op mijn hersens vertrouwen en die modifiers lekker nazoeken dus.

[ Voor 16% gewijzigd door RSpliet op 21-12-2004 22:13 ]

Schaadt het niet, dan baat het niet


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

Seven of Nine schreef op dinsdag 21 december 2004 @ 22:09:
Die i is eigenlijk automatisme, maar ik zoek dus met die preg_match naar tekens die NIET in de 0-9 reeks zitten, vandaar dat golfje ook. Die getallen kunnen zo lang zijn als je zelf wilt, het gaat om een teken die niet in de ~[0-9] reeks zit, eentje is nl. al teveel ;).
Ow, verrek, ja, ik las even over de ~ heen. :P
Kijk, jij mag van mij vaker mompelen, tnx :) Volgende keer toch maar eens niet op mijn hersens vertrouwen en die modifiers lekker nazoeken dus.
Betekent dat dat je het hebt opgelost daarmee? Of dat je ernaar gaat kijken? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • RSpliet
  • Registratie: Juni 2003
  • Laatst online: 27-11-2025
-NMe- schreef op dinsdag 21 december 2004 @ 22:32:
[...]

Ow, verrek, ja, ik las even over de ~ heen. :P

[...]

Betekent dat dat je het hebt opgelost daarmee? Of dat je ernaar gaat kijken? :)
Jazeker is het nu opgelost. Heel abstract word de replace als volgt nu:
PHP:
1
$message = preg_replace("/\[size=(.+?)\](.+?)\\[\/size\]/ise", "'<span style=\"font-size: '.self::parse_filter_ubb(\"\\1\",\"num\",12).';\">\\2</span>'" ,$message);

Waarbij ik nog wel even ga kijken of er niet met functieinvoeren kan worden geklojo't

Edit: De boel is wel enorm foutgevoelig op deze manier, dat krijg je als je eval't met userinput, weet ik :). Ik dacht dat dit nog redelijk veilig te krijgen was, maar als ik zie dat ik binnen 4 tellen een foutmelding op mijn scherm kan toveren, vrees ik dat het zo een soepzooitje word. Controle van onbekende lappen tekst word mij teveel. Ik ga dus toch nadenken over een andere aanpak, toch bedankt :)

[ Voor 44% gewijzigd door RSpliet op 22-12-2004 16:16 ]

Schaadt het niet, dan baat het niet


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 23:35

crisp

Devver

Pixelated

kijk anders eens naar preg_replace_callback ;)

Intentionally left blank

Pagina: 1