2011-11-02 79 views
4

可能重複:
replace multiple placeholders with php?有效的方式來使用變量替換佔位符

我有一個.txt文件工作作爲模板。我製作了幾個佔位符,如{{NAME}},我想用變量替換它們。什麼是最有效的方法來做到這一點?請記住,我的模板中有大約10個佔位符。

沒有比str_replace更好的方法嗎?

+0

你總是可以創建自己的功能,環繞'str_replace',也許需要一個數組作爲輸入。這就是我會做的。 –

+2

你可以使用'str_replace()'來解釋* actual *問題嗎? – Phil

+0

你想用變量或變量的內容來替換它嗎?它又是怎樣的醜陋 - 與什麼相比?也許你應該分享一些代碼,你現在怎麼做... – aurora

回答

7

str_replace不僅難看,而且低迷,如果你需要更換10個變量(做一個二進制搜索,並從一開始就開始對每個備選)。

而是使用preg_replace_callback,要麼列出所有10個變量一次,或使用後期查找:

$src = preg_replace_callback('/\{\{(\w+)}}/', 'replace_vars', $src); 
        # or (NAME|THING|FOO|BAR|FIVE|SIX|SVN|EGT|NNE|TEN) 

function replace_vars($match) { 
    list ($_, $name) = $match; 
    if (isset($this->vars[$name])) return $this->vars[$name]; 
} 
+0

Ehm ...使用正則表達式而不是精確搜索?似乎並不是一種提升性能的好方法...... – Ivan

+5

那麼,在提升性能時,您應該看看實際的基準測試,而不是推測;) - PCRE非常高度優化以尋找替代品。 str_replace在內部使用循環。 「正則表達式總是比較慢」是這裏最誤導的模因。其次,沒有等待。 – mario

+0

謝謝!這是一個非常好的例子。當我不想使用str_replace時,我正在考慮性能。我聽說它很慢。我會嘗試你的解決方案。 – OptimusCrime

14

什麼strtr

$trans = array(
    '{{NAME}}' => $name, 
    "{{AGE}}" => $age, 
    ...... 
); 
echo strtr($text, $trans); 
+0

謝謝你這個簡單而優雅的解決方案。 – Pierre

0

怎麼這麼難看約str_replace()

function replace_vars($string) 
{ 
    $vars = array('NAME'=>'Name', 'VAR2'=>'Value 2', 'VAR3'=>'Value 3'); 

    $names = array(); 
    foreach($vars as $name=>$var) { 
     $names[] = '{{'.$name.'}'; 
    } 

    return str_replace($names, $vars, $string); 
} 

function replace_vars($string) 
{ 
    $vars = array('{{NAME}}'=>'Name', '{{VAR2}}'=>'Value 2', '{{VAR3}}'=>'Value 3'); 

    return str_replace(array_keys($vars), $vars, $string); 
} 
+0

試一下:'$ vars = array('{{NAME}}'=>'{{VAR2}}','{{VAR2}}'=>'Value 2');' – hakre

+1

是不是原因我們使用'{{...}}'格式。爲了防止它偶然發生的價值? – PeeHaa

+1

那麼,通過代碼示例,您將再次替換替代品,表明該原因沒有意義,您無法區分替換狀態(A:=替換; B:=替換)。 「{{...}}」是針對狀態A給出的,而不是B。該代碼也將它們(部分地)應用於狀態B,這可以被看作是導致意想不到的甚至錯誤行爲的缺陷。我的評論是作爲一種保護措施。它可能在99.9%的情況下工作,但其餘的呢? – hakre

相關問題