0

{literal}{/literal}タグでエスケープしたいスマート変数が含まれる場合と含まれない場合があるサンプルユーザー文字列入力の配列があります。

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}
)

かなり長い間立ち往生していて、誰かが私がそれを理解するのを手伝ってくれるかどうか、あるいはそれが可能でさえあるかどうか疑問に思っていました。

4

1 に答える 1

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を1つのコマンドにマージできます

于 2012-12-09T17:37:36.930 に答える