web-dev-qa-db-fra.com

Remplacement de {{string}} dans un fichier php

J'inclus un fichier dans l'une de mes méthodes de classe et il contient du code html + php. Je retourne une chaîne dans ce code. J'ai explicitement écrit {{newsletter}} et ensuite dans ma méthode, j'ai fait ce qui suit:

$contactStr = include 'templates/contact.php';
$contactStr = str_replace("{{newsletter}}",$newsletterStr,$contactStr);

Cependant, cela ne remplace pas la chaîne. La seule raison pour laquelle je le fais est que, lorsque j'essaie de transmettre la variable au fichier inclus, elle ne semble pas la reconnaître.

$newsletterStr = 'some value';
$contactStr = include 'templates/contact.php';

Alors, comment puis-je implémenter la méthode de remplacement de chaîne?

12
jkushner

Vous pouvez utiliser PHP comme moteur de template. Pas besoin de constructions {{newsletter}}.

Supposons que vous produisiez une variable $newsletter dans votre fichier de modèle.

// templates/contact.php

<?php echo $newsletter; ?>

Pour remplacer les variables, procédez comme suit:

$newsletter = 'Your content to replace';

ob_start();        
include('templates/contact.php');
$contactStr = ob_get_clean();

echo $contactStr;

// $newsletter should be replaces by `Your content to replace`

De cette façon, vous pouvez créer votre propre moteur de template.

class Template
{
    protected $_file;
    protected $_data = array();

    public function __construct($file = null)
    {
        $this->_file = $file;
    }

    public function set($key, $value)
    {
        $this->_data[$key] = $value;
        return $this;
    }

    public function render()
    {
        extract($this->_data);
        ob_start();
        include($this->_file);
        return ob_get_clean();
    }
}

// use it
$template = new Template('templates/contact.php');
$template->set('newsletter', 'Your content to replace');
echo $template->render();

La meilleure chose à ce sujet: vous pouvez utiliser immédiatement des instructions conditionnelles et des boucles (PHP complet) dans votre modèle.

35
bitWorking

C’est un code que j’utilise pour la modélisation, devrait faire l'affaire

  if (preg_match_all("/{{(.*?)}}/", $template, $m)) {
      foreach ($m[1] as $i => $varname) {
        $template = str_replace($m[0][$i], sprintf('%s', $varname), $template);
      }
    }
12
da-hype

peut-être un peu tard, mais je cherchais quelque chose comme ça.

Le problème est que include ne renvoie pas le contenu du fichier et qu'une solution plus simple pourrait être d'utiliser la fonction file_get_contents.

$template = file_get_contents('test.html', FILE_USE_INCLUDE_PATH);

$page = str_replace("{{nombre}}","Alvaro",$template);

echo $page;
4
Octal

Utilisez output_buffers avec les variables PHP. C'est beaucoup plus sécurisé, compatible et réutilisable.

function template($file, $vars=array()) {
    if(file_exists($file)){
        // Make variables from the array easily accessible in the view
        extract($vars);
        // Start collecting output in a buffer
        ob_start();
        require($file);
        // Get the contents of the buffer
        $applied_template = ob_get_contents();
        // Flush the buffer
        ob_end_clean();
        return $applied_template;
    }
}

$final_newsletter = template('letter.php', array('newsletter'=>'The letter...'));
3
Gustav

basé sur @ da-hype

<?php
$template = "hello {{name}} world! {{abc}}\n";
$data = ['name' => 'php', 'abc' => 'asodhausdhasudh'];

if (preg_match_all("/{{(.*?)}}/", $template, $m)) {
    foreach ($m[1] as $i => $varname) {
        $template = str_replace($m[0][$i], sprintf('%s', $data[$varname]), $template);
    }
}


echo $template;
?>
0

non, n'incluez pas pour cela. include exécute du code php. et sa valeur de retour est la valeur que le fichier inclus renvoie - ou s'il n'y a pas de retour: 1.

Ce que vous voulez, c'est file_get_contents():

// Here it is safe to use eval(), but it IS NOT a good practice.
$contactStr = file_get_contents('templates/contact.php');
eval(str_replace("{{newsletter}}", $newsletterStr, $contactStr));
0
bwoebi