2012-12-04 44 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在一个命令

相关问题