2012-03-04 9 views
1

私はpreg_matを使用してテンプレート内のif文を置き換えています。私はpreg_match_allからの試合に出て試合の結果を得ようとしていて、preg_replaceを使っていますが、オフセットエラーが出ています。preg_replaceでのpreg_match_all結果の使用に関する問題

構文に関するご意見をいただければ幸いです。また、これについてもっと良い方法があるかどうか不思議です。

コードサンプル:

public function output() { 

$output = file_get_contents($this->file); 

foreach ($this->values as $key => $value) { 
    $tagToReplace = "[@$key]"; 
    $output = str_replace($tagToReplace, $value, $output); 

    $dynamic = preg_quote($key); 
    $pattern = '%\[if @'.$dynamic.'\](.*?)\[/if\]%'; // produces: %\[if @username\](.*?)\[/if\]% 

    if ($value == '') { 
    $output = preg_replace($pattern, "", $output); 
    } else { 
    preg_match_all($pattern, $output, $if_match); 
    $output = preg_replace("%\[if @".$dynamic."\]%", "", $if_match[0][0]); 
    $output = preg_replace("%\[/if]%", "", $if_match[0][0]);   
    } 

テンプレートを除く:

[if @username] <p>A statement goes here and this is [@username]</p> [/if] 
    [if @sample] <p>Another statement goes here</p> [/if] 

コントローラーの抜粋:

$layout->set("username", "My Name"); 
$layout->set("sample", ""); 
+0

現時点では、動作中のテンプレートエンジンのみを使用することを検討する必要があります。 (以前のpreg_replace_callbackの手法は賢明ではありませんでしたが、この段階的な文字列のマングリングよりも意味があります) – mario

+0

ありがとうございました - これは私が次に試してみようとしていたものです。これは、履歴書用の非常に小さなテンプレートエンジンです。私は十分にスマイを知っていますが、私は部分的にこれを学習経験としてやっています。 – jsuissa

答えて

0

コールバックを使用して、$一致ににpreg_replaceを実行するには、問題を解決:

public function output() { 

$output = file_get_contents($this->file); 

foreach ($this->values as $key => $value) { 
    $tagToReplace = "[@$key]"; 
    $output = str_replace($tagToReplace, $value, $output); 

    $dynamic = preg_quote($key); 
    $pattern = '%\[if @'.$dynamic.'\](.*?)\[/if\]%'; // produces: %\[if @username\](.*?)\[/if\]% 

    if ($value == '') { 
    $output = preg_replace($pattern, "", $output); 
    } else { 
    $callback = new MyCallback($key, $value); 
    $output = preg_replace_callback($pattern, array($callback, 'callback'), $output); 
    } 

} 

return $output; 
} 


} 

class MyCallback { 
private $key; 
private $value; 

function __construct($key, $value) { 
    $this->key = $key; 
    $this->value = $value; 
} 

public function callback($matches) { 

    $matches[1] = preg_replace("%\[if @".$this->key."\]%", "", $matches[1]); 
    $matches[1] = preg_replace("%\[/if]%", "", $matches[1]); 

    return $matches[1]; 
} 
} 
関連する問題