PHPを使用してプレーンテキストの変数を置換する最良の方法
-
08-07-2019 - |
質問
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.";
正規表現またはおそらくeval()
の使用を検討していますが、どちらが最も簡単かはわかりません。このスクリプトはローカルでのみ実行されるため、セキュリティの問題やget_defined_vars()
に関する心配は(i think?)には適用されません。
<=>:
を使用して、必要なすべての変数を配列に取得できることも追加します。$allVars = get_defined_vars();
echo $pet; // "lamb"
echo $allVars['pet']; // "lamb"
解決
信頼できるソースからのものである場合は、(劇的な一時停止) 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
他のヒント
正規表現は簡単です。また、eval()
が構文エラーを考慮することについては気にしません。
これは、PHPスタイルの変数名を見つけるためのパターンです。
\$\w+
おそらくこの一般的なパターンを使用し、PHP配列を使用して、見つかった各一致を検索します((preg_replace_callback()
)を使用します。そのように正規表現を適用する必要があるのは1回だけで、長期的には高速です) 。
$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である必要がありますか?代わりに<?= $pet ?>
でしょうか?その場合は、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()でプリペンディングを行いたいので、変数を2回ループしないでください。または、さらに良いことに、最初に割り当てるキーがmyFile.txtで使用する識別子と一致することを確認してください。