2012-11-20 42 views
0

我有一個模板系統可以根據$this->cms_language()的值顯示東西。 在這種情況下,$value將被替換爲匹配正則表達式模式的內容。 它的工作原理就像http://www.getnocms.com/2012/11/better-multi-language-template-better.htmlphp preg_replace取代所有不在輸入值的東西

$language = $this->cms_language(); 
    $pattern = array(); 
    $pattern[] = "/\{\{ if_language:$language \}\}(.*?)\{\{ elif_language:.*?\{\{ end_if }}/s"; 
    $pattern[] = "/\{\{ if_language:$language \}\}(.*?)\{\{ else \}\}.*?\{\{ end_if }}/s"; 
    $pattern[] = "/\{\{ if_language:$language \}\}(.*?)\{\{ end_if }}/s"; 
    $pattern[] = "/\{\{ if_language:.*?\{\{ elif_language:$language \}\}(.*?)\{\{ elif_language:.*?\{\{ end_if }}/s"; 
    $pattern[] = "/\{\{ if_language:.*?\{\{ elif_language:$language \}\}(.*?)\{\{ else \}\}.*?\{\{ end_if }}/s"; 
    $pattern[] = "/\{\{ if_language:.*?\{\{ elif_language:$language \}\}(.*?)\{\{ end_if }}/s"; 
    $pattern[] = "/\{\{ if_language:.*?\{\{ else \}\}(.*?)\{\{ end_if }}/s"; 
    $replacement = '$1'; 
    $value = preg_replace($pattern, $replacement, $value); 

到目前爲止一切都那麼好。但是,我發現了一個問題。例如,我寫了一個文本區域或包含任何這些模式的輸入。例如:

$value = '<input value="{{ if_language:indonesia }} do_something {{ end_if }}" />'; 

我不希望輸入值被替換,即使它與正則表達式匹配。 由於我在這裏使用了很多模式,如何才能避免這種情況?

+0

*您*無法避免這種情況。那麼最好避開文本數據。使用'{'代替'{',所以你的textarea輸入必須變成'$ value ='<輸入值= { &123; if_lang ...' – mario

+0

爲什麼通過上面的代碼首先運行它,你想要更換髮生? –

+0

我想要發生替換,除了輸入標籤裏面的那些 – goFrendiAsgard

回答

1

您可以嘗試之前,你的現有preg_replace避免這種情況在大多數情況下,添加

foreach ($pattern as &$p) { 
    $p = preg_replace("/^\//", "/(?![^<>]*>|(?:[^>]*<\/(?:[tT][eE][xX][tT][aA][rR][eE][aA]|[sS][eE][lL][eE][cC][tT])[^<>]*>))", $p); 

}}

請參閱this demo

+0

這非常有用。我仍然不明白這裏發生了什麼事。任何與「<」不匹配但以「>」結尾的字符串加上我的模式中的所有內容。這對於仍然不起作用。正則表達式有點令人沮喪:( – goFrendiAsgard

+0

不,我的意思是在textarea中,應該沒有替換。就像在的情況下。順便說一句,有什麼辦法可以這樣說: 這不是「」和不在「」之間,而不在「」之間? 無論如何,非常感謝您的友好解釋 – goFrendiAsgard

+0

@goFrendiAsgard - 我已更新我的答案和演示,你...祝你好運! –