Question

Quel est le meilleur moyen de prendre du texte brut (pas de code PHP) contenant des variables de style PHP, puis de substituer la valeur de la variable. C’est un peu difficile à décrire, voici donc un exemple.

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

J'ai envisagé d'utiliser un regex ou peut-être eval(), bien que je ne sois pas sûr de ce qui serait le plus facile. Ce script ne fonctionnera que localement. Par conséquent, toute inquiétude concernant les problèmes de sécurité et get_defined_vars() ne s'applique pas (je pense?) .

J'ajouterai simplement que je peux obtenir toutes les variables nécessaires dans un tableau en utilisant <=>:

$allVars = get_defined_vars();
echo $pet;             // "lamb"
echo $allVars['pet'];  // "lamb"
Était-ce utile?

La solution

S'il s'agit d'une source fiable, vous pouvez utiliser (pause dramatique) eval () (halètement d'horreur du public).

$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

Autres conseils

Regex serait assez facile. Et il ne se soucierait pas de ce que eval() considérerait comme une erreur de syntaxe.

Voici le modèle pour rechercher les noms de variable de style PHP.

\$\w+

Je prendrais probablement ce modèle général et utiliserais un tableau PHP pour rechercher chaque correspondance trouvée (à l'aide de (preg_replace_callback()). Ainsi, l'expression régulière ne doit être appliquée qu'une seule fois, ce qui est plus rapide à long terme. .

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

Voici ce que je viens de dire, mais je serais toujours intéressé de savoir s’il existe un meilleur moyen. Cheers.

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

Est-ce que cela doit être $ animal? Pourrait-il être <?= $pet ?> à la place? Parce que si oui, utilisez juste include. C’est l’idée même de php en tant que moteur de templates.

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

//parser.php

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

echo $contents;

Cela fera écho:

Mary had a little lamb.

Selon la situation, str_replace peut effectuer les opérations suivantes: astuce.

Exemple:

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

Lorsque vous examinez str_replace, notez que les paramètres de recherche et de remplacement peuvent comporter des tableaux de valeurs à rechercher et à remplacer.

Vous pouvez utiliser 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."

Vous voudrez probablement faire le préfixe dans get_defined_vars (), pour ne pas boucler les variables deux fois. Ou mieux encore, assurez-vous que les clés que vous affectez initialement correspondent à l'identifiant que vous utilisez dans myFile.txt.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top