str_replace - substr php
La mejor forma de sustituir variables en texto sin formato mediante PHP (6)
¿Cuál es la mejor manera de tomar algo de texto sin formato (no de código PHP) que contiene variables de estilo PHP y luego sustituirlo por el valor de la variable? Esto es un poco difícil de describir, así que aquí hay un ejemplo.
// -- 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.";
He estado considerando usar una expresión regular o quizás eval()
, aunque no estoy seguro de cuál sería más fácil. Esta secuencia de comandos solo se ejecutará localmente, por lo que cualquier preocupación con respecto a los problemas de seguridad y eval()
no se aplica (¿en serio?) .
También get_defined_vars()
que puedo obtener todas las variables necesarias en una matriz usando get_defined_vars()
:
$allVars = get_defined_vars();
echo $pet; // "lamb"
echo $allVars[''pet'']; // "lamb"
¿Tiene que ser $ mascota? ¿Podría ser <?= $pet ?>
lugar? Porque si es así, solo usa include. Esta es la idea de php como motor de plantillas.
//myFile.txt
Mary had a little <?= $pet ?>.
//parser.php
$pet = "lamb";
ob_start();
include("myFile.txt");
$contents = ob_end_clean();
echo $contents;
Esto hará eco:
Mary had a little lamb.
Dependiendo de la situación, str_replace podría hacer el truco.
Ejemplo:
// -- 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.''
Cuando vea str_replace, tenga en cuenta que los parámetros de búsqueda y reemplazo pueden tomar matrices de valores para buscar y reemplazar.
Esto es lo que me acabo de ocurrir, pero aún estaría interesado en saber si hay una mejor manera. Aclamaciones.
$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);
}
Puedes usar 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."
Probablemente desee hacer el antecedente en get_defined_vars (), de modo que no itere las variables dos veces. O mejor aún, solo asegúrese de que las claves que asigne inicialmente coincidan con el identificador que utiliza en myFile.txt.
Si es de una fuente confiable, puedes usar (pausa dramática) eval () (jadeos de horror de la audiencia).
$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
Regex sería lo suficientemente fácil. Y no le importarían las cosas que eval()
consideraría un error de sintaxis.
Aquí está el patrón para encontrar nombres de variables de estilo PHP.
/$/w+
Probablemente tomaría este patrón general y usaría una matriz PHP para buscar cada coincidencia que he encontrado (utilizando ( preg_replace_callback()
). De esta forma, la expresión regular debe aplicarse solo una vez, lo que es más rápido a largo plazo.
$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];
}