[PHP] preg_replace eval werkt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dag Tweakers. Ik heb een probleem met de /e functie van preg_replace. Om vars in mijn template parser te replacen met de waarde van die vars gebruikte ik

PHP:
1
$str .= preg_replace ( "/(%)(.*?)(%)/e", "getVariables ( \"\\2\" )", $str );


Deze manier werkte perfect, de vars werden gewoon goed gereplaced. Nu ben ik de parser echter naar een class aan het herschrijven en loop ik tegen een probleem aan. De functie getVariables kan ik uiteraard niet zoals bovenstaand aanroepen, dat wordt immers $this->getVariables. Echter, wanneer ik

PHP:
1
$str .= preg_replace ( "/(%)(.*?)(%)/e", "$this->getVariables ( \"\\2\" )", $str );


doe, wordt de functie niet aangereoepn. Doe ik bijv

PHP:
1
$str .= preg_replace ( "/(%)(.*?)(%)/e", $this->getVariables ( "\\2" ), $str );


dan wordt de functie wel aangeroepen, maar heeft \\2 weer geen waarde. Op php.net heeft iemand een soortgelijk probleem (eerste post beschrijving functie preg_replace), en heeft dat opgelost met eval. Ten eerste staat het gebruik van eval me sowieso al tegen (en niet zo'n beetje ook), en ten tweede werkt ook die oplossing niet bij mij. Het gaat dan om

PHP:
1
$str .= preg_replace ( "/(%)(.*?)(%)/e", 'eval(\'return $this->getVariables("$2");\')', $str );


In elk geval, ik kom dus geen stap verder. Misschien dat een tweaker een idee heeft hoe ik dit kan oplossen? De /e manier met \\2 werkte eerder perfect, dus die manier zou ik graag zo willen houden...

Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023

kvdveer

Z.O.Z.

Je zit met een scope-probleem vrees ik. Ik heb een dergelijk probleem zelf een keer aan de hand gehad, en uiteindelijk heb ik het heel ranzig met preg_replace_callback en een globale variabele opgelost...

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
PHP:
1
$str .= preg_replace ( "/(%)(.*?)(%)/e", "$this->getVariables ( '\\2' )", $str );

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Ten eerste zul je wat aan die $ moeten doen. Php zal dit namelijk als een variabele gaan zien. Zet de hele string tussen ' of gebruik \$. Voor de rest denk ik dat je inderdaad problemen gaat krijgen mbt de scope zoals ook kvdveer aangeeft. Bij php is dit echter altijd maar weer afwachten ;)..

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ahh, kijk. :) Zo zie je maar hoe je je blind kan staren op een zo'n regeltje, terwijl de oplossing zo simpel is. \$ natuurlijk :) En dat kost je dan twee dagen, soms vraag je je af waar die blindheid vandaan komt. :p

Dit is het geworden:

PHP:
1
$str .= preg_replace ( "/(%)(.*?)(%)/e", "\$this->getVariables ( '\\2' )", $str );


en verder nog een regeltje in de functie getVariables

PHP:
1
$name = str_replace ( "$", "", $name );


Geweldig jongens, bedankt! (slotje ;))