[php] variabele als variabele naam met regular expressions

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Graag zou ik een stukje code opzetten waarbij iedere keer dat %bla% voorkomt, vervangen wordt door de variabele $bla. Wat er dan tussen de percentage-tekens staat, is op zichzelf variabel. Hoe werk ik met zulke variabele namen van variabelen??

Met regular expressions is het wel te regelen dat alles tussen de twee %% gevonden wordt, maar hoe zet ik er daarna een variabelenaam tegenover? Dat zou namelijk ideaal zijn om snel een tekst te vullen met variabelen uit een database.

(Update paar minuten later). Bedenk me net dat mijn vraag misschien er wat vaag staat, dus even iets erbij typen.

Wat ik nu doe is het volgende. In een database staan een heleboel velden die gebruikt moeten kunnen worden voor een mail aan de mensen die er in staan. Nu is het wat onhandig om die allemaal keer op keer te moeten omzetten. Dan krijg je namelijk zoiets:

PHP:
1
2
3
4
5
//eerst alle variabelen uit de template voor de mail vervangen met waarden voor deze gebruiker
        $mailtekst = str_replace("%voornaam%", $voornaam, $Mail_body);
        $mailtekst = str_replace("%tussenvoegsel%", $tussenvoegsel, $mailtekst);
        $mailtekst = str_replace("%achternaam%", $achternaam, $mailtekst);
[small]enz. enz. enz.[/small]


De template voor die mail staat op zichzelf in een database en die is dus gevuld met teksten als
Beste %voornaam% %tussenvoegsel% %achternaam%
Dit kan toch vast wel slimmer dan voor iedere variabele een replace uit te moeten voeren??

[ Voor 52% gewijzigd door TromboneFreakus op 18-12-2005 20:13 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Je zou kunnen kijken naar een preg_replace met een regular expression met de /e modifier. Hiermee kun je in feite de match als variabele aan een functie voeren.

Een niet-getest voorbeeld:
PHP:
1
2
3
4
5
6
$mapping = array (
   'bla' => 'waarde1',
   'melp' => 'waarde2'
);

$str = preg_replace ( '/%([^% ]+)%/e', "\$mapping['\\1']", 'input %bla% string' );

Zie de documentatie voor meer info.

Acties:
  • 0 Henk 'm!

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Verwijderd schreef op zondag 18 december 2005 @ 20:08:
Je zou kunnen kijken naar een preg_replace met een regular expression met de /e modifier. Hiermee kun je in feite de match als variabele aan een functie voeren.

Een niet-getest voorbeeld:
PHP:
1
2
3
4
5
6
$mapping = array (
   'bla' => 'waarde1',
   'melp' => 'waarde2'
);

$str = preg_replace ( '/%([^% ]+)%/e', "\$mapping['\\1']", 'input %bla% string' );

Zie de documentatie voor meer info.
Maar zo moet je in ieder geval nog wel de variabelen definieren in een array. Kan het ook met %anything%??

Acties:
  • 0 Henk 'm!

Verwijderd

Je hebt zo'n mapping toch al? $_GLOBALS['variabelnaam'] (ja niet al te schoon... Het zij zo)

Maar mij lijkt het wel slimmer te mappen, ik weet niet waar je de te doorzoeken string vandaan haalt, maar het lijkt me niet de bedoeling dat als een gebruiker zo'n string opgeeft, dat hij dan systeemvariabellen kan weergeven.

Oh ik zie dat het voor een templatesysteem is. Dan is bovenstaande niet zo enorm van toepassing (behalve als je templates door users verandert kunnen worden).

[ Voor 98% gewijzigd door Verwijderd op 18-12-2005 20:31 ]


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Niet getest, maar iets als dit:

PHP:
1
2
3
4
preg_match_all("|%(\w+)%|",$subject,$matches);
for ($i = 0; $i < count($matches); $i++) {
 $subject = str_replace($subject, '%'.$matches[$i][1].'%',$$matches[$i][1]);
}

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
je zegt dat je alle variabelen uit een database haalt. Dan kan je toch gewoon een loopje doen
PHP:
1
2
3
4
foreach( $woorden as $key => $value )
{
    $tekst = str_replace( '%' . $key . '%', $value, $tekst );
}

?? Dan hoef je niet allemaal gevaarlijke dingen te doen met variabele variabelen. In dit voorbeeldje doe ik het met een array maar je kan hetzelfde natuurlijk ook met een database doen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Ik kwam net zelf al iets tegen met gebruik van dubbele dollartekens, dus zo:
PHP:
1
2
3
4
$arr = array("voornaam", "tussenvoegsel", "achternaam");
foreach ($arr as $value) {
   $tekst = str_replace("%$value%", $$value, $tekst);
}
Dan hoef je niet allemaal gevaarlijke dingen te doen met variabele variabelen.
Wat is daar gevaarlijk aan??

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Gevaarlijk is het bij mijn weten niet, maar vies wel. Erg vies. :P

'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.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als je het zo hebt staan is het in princiepe niet eens gevaarklijk nee. Maar het is wel onoverzichtelijk en lastig te debuggen. Je vult de variabele namenlijk ergens anders in je code, en helemaal als je dat ook doet door gebruik te maken van variabele variabelen dan weet je op een gegeven moment totaal niet meer welke variabelen je nou hebt en loop je ook het gevaar dat je variabelen laat tonen die je niet wilt of dat je zelf variabelen overschrijft waarvan je dat niet wilt.

Zeker als de key en de value gewoon uit een database komen zijn er zoveel betere manieren. Je kan dan gewoon door je recordset heenlopen en alle waarden met de key vervangen door de value.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

-NMe- schreef op zondag 18 december 2005 @ 21:03:
Gevaarlijk is het bij mijn weten niet, maar vies wel. Erg vies. :P
Aan de ene kant is het i.d.d. vies, maar aan de andere kant is een code als de navolgende toch zo raar niet? Ik bedoel, het is niet onveilig - mits je goede controles uitvoert - en met wat comment erbij is het goed terug te halen;

PHP:
1
2
$foo = 'artikelnaam';
$artikel = ${$foo};


Ik moet overigens toegeven dat 9 van de 10 situaties als de bovenstaande op te lossen zijn met arrays.

[ Voor 12% gewijzigd door Verwijderd op 19-12-2005 12:26 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op maandag 19 december 2005 @ 12:25:
[...]


Aan de ene kant is het i.d.d. vies, maar aan de andere kant is een code als de navolgende toch zo raar niet? Ik bedoel, het is niet onveilig - mits je goede controles uitvoert - en met wat comment erbij is het goed terug te halen;

PHP:
1
2
$foo = 'artikelnaam';
$artikel = ${$foo};


Ik moet overigens toegeven dat 9 van de 10 situaties als de bovenstaande op te lossen zijn met arrays.
De voorbeelden die hierboven zijn gegeven zijn in eerste instantie niet echt gevaarlijk aangezien het redelijk onder controle is in zo'n voorbeeldje. Maar als je toch zo vast weet welke variabelen je hebt waarom moet het dan nog variabel zijn? In jouw voorbeeld weet je bijvoorbeeld dat je een var $artikelnaam hebt dus waarom schrijf je dan niet gewoon
PHP:
1
$artikel = $artikelnaam;

Als het teveel key -> values zijn om allemaal uit te typen doe het dan gewoon helemaal in een array met de key en de value.

Ik heb nog nooit meegemaakt dat ik variabele variabelen nodig had.
PHP:
1
2
3
4
$keyvalues = array( 'key1' => 'value1', 'key2' => 'value2' );
foreach( $keyvalues as $key => $value ){
    $str = str_replace( "%$key%", $value, $str );
}

is veel minder foutgevoelig als
PHP:
1
2
3
4
5
6
$key1 = 'value1';
$key2 = 'value2';
$keys = array( 'key1', 'key2' );
foreach( $keys as $key ){
    $str = str_replace( "%$key%", $$key, $str );
}

aangezien je niet per ongeluk de verkeerde variabelen kunt overschrijven. Je zult je values toch ergens moeten zetten dus doe het dan meteen gewoon goed.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1