What's the best way to take some plain text (not PHP code) which contains PHP-style variables, and then substitute in the value of the variable. This is kinda hard to describe, so here's an example.
// -- myFile.txt --
Mary had a little $pet.
// -- parser.php --
$pet = "lamb";
// open myFile.txt and transform it such that...
$newContents = "Mary had a little lamb.";
I've been considering using a regex or perhaps eval()
, though I'm not sure which would be easiest. This script is only going to be running locally, so any worries regarding security issues and eval()
do not apply (i think?).
I'll also just add that I can get all the necessary variables into an array by using get_defined_vars()
:
$allVars = get_defined_vars();
echo $pet; // "lamb"
echo $allVars['pet']; // "lamb"
Regex would be easy enough. And it would not care about things that
eval()
would consider a syntax error.Here's the pattern to find PHP style variable names.
I would probably take this general pattern and use a PHP array to look up each match I've found (using (
preg_replace_callback()
). That way the regex needs to be applied only once, which is faster on the long run.If it's from a trusted source you can use (dramatic pause) eval() (gasps of horror from the audience).
Here's what I've just come up with, but I'd still be interested to know if there's a better way. Cheers.
Does it have to be $pet? Could it be
<?= $pet ?>
instead? Because if so, just use include. This is the whole idea of php as a templating engine.This will echo out :
Depending on the situation, str_replace might do the trick.
Example:
When you look at str_replace note that search and replace parameters can take arrays of values to search for and replace.
You could use strtr:
You probably want to do the prepending in get_defined_vars(), so you don't loop the variables twice. Or better yet, just make sure whatever keys you assign initially match the identifier you use in myFile.txt.