Pergunta

Qual é a melhor maneira de pegar algum texto simples (não código PHP) que contém variáveis ​​​​no estilo PHP e, em seguida, substituir o valor da variável.Isso é meio difícil de descrever, então aqui está um exemplo.

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

Estou pensando em usar um regex ou talvez eval(), embora não tenha certeza de qual seria mais fácil.Este script só será executado localmente, portanto, quaisquer preocupações relacionadas a questões de segurança e eval() não se aplica (eu penso?).

Também acrescentarei que posso colocar todas as variáveis ​​necessárias em um array usando get_defined_vars():

$allVars = get_defined_vars();
echo $pet;             // "lamb"
echo $allVars['pet'];  // "lamb"
Foi útil?

Solução

Se for de uma fonte confiável, você pode usar (pausa dramática) avaliação() (suspiros de horror do público).

$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

Outras dicas

Regex seria bastante fácil.E não se importaria com coisas que eval() consideraria um erro de sintaxe.

Aqui está o padrão para encontrar nomes de variáveis ​​de estilo PHP.

\$\w+

Eu provavelmente pegaria esse padrão geral e usaria um array PHP para procurar cada correspondência que encontrei (usando (preg_replace_callback()).Dessa forma, o regex precisa ser aplicado apenas uma vez, o que é mais rápido no longo prazo.

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

Aqui está o que acabei de descobrir, mas ainda estaria interessado em saber se existe uma maneira melhor.Saúde.

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

Tem que ser $pet?Poderia ser <?= $pet ?> em vez de?Porque se sim, basta usar include.Esta é a ideia do php como um mecanismo de modelagem.

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

//parser.php

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

echo $contents;

Isso irá ecoar:

Mary had a little lamb.

Dependendo da situação, str_replace pode resolver o problema.

Exemplo:

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

Ao observar str_replace, observe que os parâmetros de pesquisa e substituição podem receber matrizes de valores para pesquisar e substituir.

Você poderia 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."

Você provavelmente deseja fazer o prefixo em get_definido_vars(), para não repetir as variáveis ​​​​duas vezes.Ou melhor ainda, certifique-se de que as chaves atribuídas inicialmente correspondam ao identificador usado em myFile.txt.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top