PHP kullanarak düz metin değişkenleri yerine en iyi yolu

7 Cevap php

Bazı düz metin PHP-tarzı değişkenleri içerir (PHP kodu değil) alır, ve daha sonra değişkenin değeri yerine en iyi yolu nedir. Bu tarif etmek biraz zor, bu yüzden burada bir örnek.

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

Ben kolay olurdu emin değilim ama ben, bir regex ya da belki eval() kullanarak düşünüyor oldum. Bu komut, yalnızca yerel olarak çalışan olacak, bu yüzden güvenlik sorunları ve eval() geçerli değildir ile ilgili herhangi bir endişeleri (i think?).

Ben de sadece ben kullanarak bir diziye gerekli tüm değişkenleri alabilirsiniz eklemek get_defined_vars() olacak:

$allVars = get_defined_vars();
echo $pet;             // "lamb"
echo $allVars['pet'];  // "lamb"

7 Cevap

Eğer eval() (dinleyicilerin dehşet soluk soluğa) (dramatik duraklama) kullanabilirsiniz güvenilir bir kaynaktan gelen buysa.

$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 yeterince kolay olurdu. Ve eval(), bir sözdizimi hatası olduğunu düşüneceği şeyler umurumda olmaz.

Burada PHP tarzı değişken adlarını bulmak için desen bulunuyor.

\$\w+

Ben muhtemelen bu genel bir model almak ve (uzun daha hızlı olan.) {[) (0]} (regex sadece bir kez uygulanması gereken bu yolu kullanarak bulduğum her maç aramak için bir PHP dizi kullanmak çalıştırın.

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

İşte ben sadece gelip buydu, ama ben yine de daha iyi bir yolu olup olmadığını bilmek ilgi duyarım. Şerefe.

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

Basit bir doğal PHP şablon motoru uygulamak için çalışıyoruz gibi görünüyor. Uzun zaman önce ben Beyond The Template Engine adlandırılan bu konuda ilginç bir makale bulundu. Bunu ilham bulabilirsiniz.

O $ hayvan olmak zorunda mı? O <?= $pet ?> yerine olabilir mi? Eğer öyleyse, sadece kullanmak Çünkü içerir. Bu bir çiftleşmiş motoru olarak php bütün fikir.

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

//parser.php

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

echo $contents;

Bu echo olacaktır:

Mary had a little lamb.

Duruma bağlı olarak, str_replace hile yapabilir.

Örnek:

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

Arama ve değiştirme parametreleri aramak ve değiştirmek için, değer dizilerini alabilir str_replace not baktığınızda.

Sen kullanabilirsiniz 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."

Muhtemelen get_defined_vars () de başa dosya eklemeyi yapmak istiyorum, bu nedenle iki kez döngü değişkenleri yok. Veya daha iyisi, sadece size myfile.txt kullandığınız tanımlayıcı maç başlangıçta atamak ne tuşları emin olun.