Frage

Was ist der beste Weg, um einen einfachen Text (kein PHP-Code) zu nehmen, der Variablen im PHP-Stil enthält und dann den Wert der Variablen ersetzt. Dies ist ein bisschen schwer zu beschreiben, also hier ist ein Beispiel.

// -- 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.";

Ich habe darüber nachgedacht, einen Regex zu verwenden oder vielleicht eval(), obwohl ich nicht sicher bin, was am einfachsten wäre. Dieses Skript wird nur lokal ausgeführt, sodass sich Sorgen um Sicherheitsprobleme und eval() nicht bewerben (Ich denke?).

Ich füge auch hinzu, dass ich alle notwendigen Variablen in ein Array einbeziehen kann get_defined_vars():

$allVars = get_defined_vars();
echo $pet;             // "lamb"
echo $allVars['pet'];  // "lamb"
War es hilfreich?

Lösung

Wenn es aus einer vertrauenswürdigen Quelle stammt, können Sie verwenden (dramatische Pause) eval () (Keuchen des Horrors aus dem Publikum).

$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

Andere Tipps

Regex wäre einfach genug. Und es würde sich nicht um Dinge kümmern, die eval() würde einen Syntaxfehler in Betracht ziehen.

Hier ist das Muster, um PHP -Variablennamen zu finden.

\$\w+

Ich würde wahrscheinlich dieses allgemeine Muster nehmen und ein PHP -Array verwenden, um jede Übereinstimmung nachzuschlagen, die ich gefunden habe (mit (mit (mit (mitpreg_replace_callback()). Auf diese Weise muss der Regex nur einmal angewendet werden, was auf lange Sicht schneller ist.

$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];
}

Folgendes habe ich mir gerade ausgedacht, aber ich wäre immer noch interessiert zu wissen, ob es einen besseren Weg gibt. Prost.

$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);
}

Muss es $ PET sein? Könnte es sein <?= $pet ?> stattdessen? Denn wenn ja, verwenden Sie einfach nur einschließen. Dies ist die ganze Idee von PHP als Vorlagenmotor.

//myFile.txt
Mary had a little <?= $pet ?>.

//parser.php

$pet = "lamb";
ob_start();
include("myFile.txt");
$contents = ob_end_clean();

echo $contents;

Dies wird auswirken:

Mary had a little lamb.

Kommt auf die Situation an, str_replace könnte den Trick machen.

Beispiel:

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

Wenn Sie sich str_replace ansehen, beachten Sie, dass die Such- und Ersetzen von Parametern Arrays von Werten benötigen, um nach zu suchen und zu ersetzen.

Du könntest benutzen 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."

Sie möchten wahrscheinlich die Vorbereitung in get_defined_vars () durchführen, damit Sie die Variablen nicht zweimal schleifen. Oder noch besser, stellen Sie einfach sicher, dass die Tasten, die Sie anfangs zuweisen, der Kennung in myFile.txt übereinstimmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top