8

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()。このスクリプトはローカルでのみ実行されるため、セキュリティの問題に関する心配はありeval()ません(私は思いますか?)

また、次を使用して、必要なすべての変数を配列に入れることができることも追加しますget_defined_vars()

$allVars = get_defined_vars();
echo $pet;             // "lamb"
echo $allVars['pet'];  // "lamb"
4

6 に答える 6

11

正規表現は簡単です。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];
}
于 2008-11-12T07:17:26.360 に答える
5

信頼できるソースからのものである場合は、(劇的な一時停止) 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
于 2008-11-12T08:39:58.347 に答える
2

これが私が思いついたものですが、もっと良い方法があるかどうかを知りたいと思っています。乾杯。

$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);
}
于 2008-11-12T07:17:23.053 に答える
2

$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.
于 2008-11-12T21:46:39.443 に答える
0

状況によっては、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 を見ると、検索および置換パラメーターは、検索および置換する値の配列を取ることができることに注意してください。

于 2008-11-12T07:23:18.873 に答える
-1

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 で使用する識別子と一致することを確認してください。

于 2008-11-12T21:53:02.130 に答える