Süper Temel Templating Sistemi

4 Cevap php

Ben aşağıdaki şemayı kullanarak düzenli bir ifade ile bir dosyada şeyleri değiştirmek mümkün olmak istiyorum:

Ben bir dizi var:

$data = array(
  'title' => 'My Cool Title',
  'content' => ''
)

Ben de bir şablon var (Açıklık aşkına, biz altında bir değişkene atanır kabul edeceğiz $template)

<html>
<title><% title %></title>
<body><% content %></body>
</html>

Ben her şeyi yapmak için normal bir ifade kullanmak mümkün olmak istiyorum, bu yüzden mümkün olduğunca genel olabilir; Aşağıdaki (hangi çalışmaz) o benim bıçak olduğunu

$endMarkup = preg_replace('/<% ([a-z]+) %>/',$data["\\1"], $template);

Dizi dizine göre bir şablon içine ilişkisel dizi verileri koymak için temiz bir çözüm var mı?

4 Cevap

Elden önce küçük bir çalışma ile tek bir preg_replace çağrısı ile yapabilirsiniz:

$replacements = array();
foreach ($data as $search => $replacement) {
   $replacements["/<% $search %>/"] = $replacement;
}
$endMarkup = preg_replace(
     array_keys($replacements), 
     array_values($replacements), 
     $template);

Eğer istiyorsa regex olmadan deneyebilirsiniz. Fonksiyonu str_replace bunun için yapıldı. Eğer regex anlamak istemiyorsanız bu sizin için en iyi seçenek olacaktır.

Test verileri:

$data = array(
  'title' => 'My Cool Title',
  'content' => ''
);

$file = <<< EOF
<html>
<title><% title %></title>
<body><% content %></body>
</html>
EOF;

Fonksiyon ve örneğin:

function replace_template($template, $data)
{
    $replace = array_fill(0, count($data), '<%% %s %%>');
    $keys = array_map('sprintf', $replace, array_keys($data));
    $output = str_replace($keys, $data, $template);
    return $output;
}

echo replace_template($file, $data);

Neden tüm çiftleşmiş ile rahatsız etmek istiyorsun? PHP zaten bir çiftleşmiş dildir. Eğer kod yürütme olasılığını ekarte etmek için çalıştığınız sürece, ihtiyacınız olan her şey dile inşa edilmiştir.

Kısa etiketleri ile düz PHP kullanarak şablonları yazabilirsiniz. Sen değişken kapsamı biraz sınırlamak için bir fonksiyon tüm kaydırılabilir. Sen import() bir dizi üzerinden değişkenlerin bir avuç almak için kullanabilirsiniz. Sen include kullanabilir veya require() yükleme işlemek için, ayrıştırma & dosyasına değerleri ekleme. Sen (ob_start() / ob_end()) bir dize çıkışı yakalayan işlemek için çıktı tamponlama kullanabilirsiniz. Her şey dahili, hızlı ve iyice test.

Sen preg_replace_callback() ile yapabilirsiniz. İşte ben bunu yapmak istiyorum nasıl:

function get_data($matches) {
    global $data;

    return $data[$matches[1]];
}

$endMarkup = preg_replace_callback('/<% ([a-z]+) %>/', 'get_data', $template);

Ya da tüm create_function() kullanarak tek satırda isterseniz:

$endMarkup = preg_replace_callback('/<% ([a-z]+) %>/', create_function('$matches', 'global $data; return $data[$matches[1]];'), $template);