2012-12-04 106 views
0

我有一個樣本用戶字符串輸入數組,其中可能包含smarty變量,也可能不包含smarty變量,它們使用{literal} {/ literal}標記進行轉義。在保留smarty變量的情況下轉義用戶輸入

Array 
(
    [0] => {$PLEASE} 
    [1] => {PLEASE} 
    [2] => {{PLEASE}} 
    [3] => {{{PLEASE}}} 
    [4] => {a{PLEASE}} 
    [5] => {a{$PLEASE}} 
    [6] => {{$PLEASE}a} 
    [7] => {{PLEASE}a} 
    [8] => {{{$PLEASE}}} 
    [9] => {{{{PLEASE}}}} 
) 

這是我希望實現的。

Array 
(
    [0] => {$PLEASE} 
    [1] => {literal}{PLEASE}{/literal} 
    [2] => {literal}{{PLEASE}}{/literal} 
    [3] => {literal}{{{PLEASE}}}{/literal} 
    [4] => {literal}{a{PLEASE}{/literal} 
    [5] => {literal}{a{/literal}{$PLEASE}{literal}}{/literal} 
    [6] => {literal}{{/literal}{$PLEASE}{literal}a}{/literal} 
    [7] => {literal}{PLEASE}a}{/literal} 
    [8] => {literal}{{{/literal}{$PLEASE}{literal}}}{/literal} 
    [9] => {literal}{{{{PLEASE}}}}{/literal} 
) 

現在我有這個

$data = preg_replace('/{+([^\$])([a-z0-9]*)}+/si', '{literal}{\1\2}{/literal}', $data); 

這給了我

Array 
(
    [0] => {$PLEASE} 
    [1] => {literal}{PLEASE}{/literal} 
    [2] => {literal}{PLEASE}{/literal} 
    [3] => {literal}{PLEASE}{/literal} 
    [4] => {a{literal}{PLEASE}{/literal} 
    [5] => {a{$PLEASE}} 
    [6] => {{$PLEASE}a} 
    [7] => {literal}{PLEASE}{/literal}a} 
    [8] => {{{$PLEASE}}} 
    [9] => {literal}{PLEASE}{/literal} 
) 

一直停留相當一段時間了,想知道是否有人能幫助我找到答案,或者如果它甚至可能這樣做。

回答

0

好吧,我敢肯定有一個更優雅的方式,也許是一個內膽,但不管,它具有以下工作:

//Step 1: Replace 'real' smarty variables with an intermediate string 
$data1 = preg_replace('/{(\$\w+)}/', "!!!$1!!!", $arr); 
//replace start and end curly braces with {literal}: 
$data2 = preg_replace('/{(.*)}/', '{literal}{$1}{/literal}', $data); 
//Replace all inner smarty variables with their original string: 
$data3 = preg_replace('/.!!!(.*)!!!/', '{/literal}$1{literal}', $data2); 
//Replace standalone variables with their original string: 
$data4 = preg_replace('/^!!!(.*)!!!$/', '{$1}', $data3); 

您可以合併步驟3 & 4在一個命令

相關問題