2013-07-25 9 views
8

私のクラスメソッドの1つにファイルを含めています。そのファイルにhtml + phpコードがあります。私はそのコードで文字列を返します。私は明示的に{{newsletter}}を書いた後、私の方法で私は次のようでした:PHPファイル内の{{string}}を置換する

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

しかし、それは文字列を交換していません。私がこれをやっている唯一の理由は、インクルードされたファイルに変数を渡そうとすると、それを認識していないように見えるからです。

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

文字列置換方法はどのように実装しますか?

+0

あなた 'include'は' return'を持っていますか? –

+0

ファイルを含めると、ページ内のリターンがトリガーされますか?そうは思わないでください。ファイルをインクルードし、文字列を返す関数を呼び出す必要があります。 – RelevantUsername

+0

@RelevantUsername ["インクルードされたファイル内でreturn文を実行して、そのファイル内の処理を終了し、それを呼び出したスクリプトに戻ることができます。また、インクルードされたファイルから値を返すこともできます"(http://uk3.php.net/manual/en/function.include.php) – IMSoP

答えて

28

PHPをテンプレートエンジンとして使用できます。 {{newsletter}}コンストラクトの必要はありません。

テンプレートファイルに変数$newsletterを出力したとします。独自のテンプレートエンジンを構築することができます。このように

$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` 

:変数は、以下のんを置き換えるために

// templates/contact.php 

<?php echo $newsletter; ?> 

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(); 

最高のこと:条件文とループ(完全なPHP)をテンプレートですぐに使用できます。

+3

インクルードされたファイルを変数汚染(*すなわち '$ this' *)から保護したい場合、リバウンドクロージャでラップできます:' call_user_func(Closure :: bind(function(){include func_get_arg(0);}、$ path); ' – Dan

+0

@Bracketworks良い点..それはありがたいことです。 – bitWorking

+0

私は間違っているかもしれませんが、この例を理解する限り、前に宣言した変数 '$ newsletter'を同じ値で上書きしています。 stilは後で変数をエコーする必要があるので、この例は私にとって無効であると思われ、 '$ x = 'foo'と等価です。 echo $ x; ' –

0

いいえ、これには含まれません。 includeはPHPコードを実行しています。そして、それの戻り値は、値が含まれるファイルを返します - またはノーリターンが存在しない場合:1.

何が欲しいの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)); 
+1

' eval'の使用は非常に安全ではなく、一部のインストールでは許可されていません。 – Gustav

+1

実際、私は[docsを読んで](http://uk3.php.net/manual/en/function.include.php)でした。 'include'のデフォルトの戻り値は' 1'です。インクルードが失敗した場合は 'false'です(どうしてブール値' true'ではないのか分かりませんが、それはドキュメントのことです)。 – IMSoP

+1

@Gustavこれは、この文脈でファイルを含むほど安全です。あなたはユーザーの入力に取り組んでいません。 (そしてevalはバニラのPHPで無効にすることはできません。余分な拡張が必要です...) – bwoebi

12

これは私がテンプレートに使用しているコードである、はずトリックを行う

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

sprintf( '$%s'、$$ varname)を意味しましたか? – crafter

+2

実際にはsprintf( '%s'、$$ varname)のように見えます –

3

output_buffersをPHP変数とともに使用します。これははるかに安全で、互換性があり、再利用可能です。

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...')); 
4

多分少し遅れましたが、私はこのようなものを探していました。

問題は、インクルードがファイルの内容を返さないため、file_get_contents関数を使用する方が簡単な解決策である可能性があります。

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

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

echo $page; 
0
@ダ・誇大広告に基づいて

<?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; 
?> 
関連する問題