Лучший способ замены переменных в обычном тексте с помощью PHP
каков наилучший способ взять некоторый простой текст (не PHP-код), который содержит переменные в стиле PHP, а затем заменить значение переменной. Это довольно трудно описать, вот пример.
// -- 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.";
Я думал использовать regex или, возможно,eval()
, хотя я не уверен, что будет проще. Этот скрипт будет работать только локально, поэтому любые проблемы с безопасностью и eval()
не применяются (i думаешь?).
Я также просто добавлю, что я могу получить все необходимые переменные в массив, используя get_defined_vars()
:
$allVars = get_defined_vars();
echo $pet; // "lamb"
echo $allVars['pet']; // "lamb"
6 ответов
Если это из надежного источника можно использовать (драматическая пауза) eval () (вздох ужаса в зале).
$text = 'this is a $test'; // single quotes to simulate getting it from a file
$test = 'banana';
$text = eval('return "' . addslashes($text) . '";');
echo $text; // this is a banana
Regex было бы достаточно легко. И ему было бы наплевать на то, что eval()
рассмотрит синтаксическую ошибку.
вот шаблон для поиска имен переменных стиля PHP.
$\w+
Я бы, вероятно, взял этот общий шаблон и использовал массив PHP для поиска каждого найденного мной соответствия (используя (preg_replace_callback()
). Таким образом, регулярное выражение должно применяться только один раз, что быстрее в долгосрочной перспективе.
$allVars = get_defined_vars();
$file = file_get_contents('myFile.txt');
// unsure if you have to use single or double backslashes here for PHP to understand
preg_replace_callback ('/$(\w+)/', "find_replacements", $file);
// replace callback function
function find_replacements($match)
{
global $allVars;
if (array_key_exists($match[1], $allVars))
return $allVars[$match[1]];
else
return $match[0];
}
$allVars = get_defined_vars();
$file = file_get_contents('myFile.txt');
foreach ($allVars as $var => $val) {
$file = preg_replace("@\$" . $var . "([^a-zA-Z_0-9\x7f-\xff]|$)@", $val . "\1", $file);
}
Это должно быть $ pet? Может быть ... --2--> вместо? Потому что если это так, просто используйте include. В этом вся идея php как механизма шаблонов.
//myFile.txt
Mary had a little <?= $pet ?>.
//parser.php
$pet = "lamb";
ob_start();
include("myFile.txt");
$contents = ob_end_clean();
echo $contents;
Это Эха :
Mary had a little lamb.
в зависимости от ситуации как str_replace может сделать трюк.
пример:
// -- myFile.txt --
Mary had a little %pet%.
// -- parser.php --
$pet = "lamb";
$fileName = myFile.txt
$currentContents = file_get_contents($fileName);
$newContents = str_replace('%pet%', $pet, $currentContents);
// $newContents == 'Mary had a little lamb.'
когда вы смотрите на str_replace обратите внимание, что параметры поиска и замены могут принимать массивы значений для поиска и замены.
можно использовать strtr:
$text = file_get_contents('/path/to/myFile.txt'); // "Mary had a little $pet."
$allVars = get_defined_vars(); // array('pet' => 'lamb');
$translate = array();
foreach ($allVars as $key => $value) {
$translate['$' . $key] = $value; // prepend '$' to vars to match text
}
// translate is now array('$pet' => 'lamb');
$text = strtr($text, $translate);
echo $text; // "Mary had a little lamb."
вы, вероятно, хотите сделать добавление в get_defined_vars (), поэтому вы не зацикливаете переменные дважды. Или еще лучше, просто убедитесь, что все ключи, которые вы назначаете изначально, соответствуют идентификатору, который вы используете в myFile.формат txt.