Domanda

Qual è il modo migliore per prendere del testo semplice (non codice PHP) che contiene variabili in stile PHP, e quindi sostituire il valore della variabile. Questo è un po 'difficile da descrivere, quindi ecco un esempio.

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

Ho pensato di usare una regex o forse eval(), anche se non sono sicuro di quale sarebbe la cosa più semplice. Questo script verrà eseguito solo localmente, quindi qualsiasi preoccupazione relativa ai problemi di sicurezza e get_defined_vars() non si applica (penso?) .

Aggiungerò anche che posso ottenere tutte le variabili necessarie in un array usando <=>:

$allVars = get_defined_vars();
echo $pet;             // "lamb"
echo $allVars['pet'];  // "lamb"
È stato utile?

Soluzione

Se proviene da una fonte attendibile, puoi utilizzare (pausa drammatica) eval () (sussulti dell'orrore dal pubblico).

$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

Altri suggerimenti

Regex sarebbe abbastanza facile. E non gli interesserebbe cose che eval() considererebbero un errore di sintassi.

Ecco lo schema per trovare i nomi delle variabili di stile PHP.

\$\w+

Probabilmente prenderei questo schema generale e userei un array PHP per cercare ogni corrispondenza che ho trovato (usando (preg_replace_callback()). In questo modo il regex deve essere applicato solo una volta, che è più veloce nel lungo periodo .

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

Ecco cosa ho appena escogitato, ma sarei comunque interessato a sapere se esiste un modo migliore. Cin cin.

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

Deve essere $ pet? Potrebbe essere invece <?= $pet ?>? Perché se è così, basta usare include. Questa è l'idea di php come motore di template.

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

//parser.php

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

echo $contents;

Questo risuonerà:

Mary had a little lamb.

A seconda della situazione, str_replace potrebbe fare trucco.

Esempio:

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

Quando guardi str_replace, nota che i parametri di ricerca e sostituzione possono prendere matrici di valori da cercare e sostituire.

Puoi utilizzare 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."

Probabilmente vuoi fare la prepending in get_defined_vars (), quindi non ripetere due volte il ciclo delle variabili. O meglio ancora, assicurati che qualsiasi chiave assegnata inizialmente corrisponda all'identificatore che usi in myFile.txt.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top