0

任何人都可以帮我解决这个问题......我对正则表达式不太擅长,而且我从几天开始就在敲我的头!

在 Smarty 中,我将这个数组 o 值包含在变量 $str 中捕获的大括号中:

{capture assign=str}{literal}
{label1: \"value1\",label2: \"value2\", label3: \"value3\",label4: \"value4\"},
{label1: \"value1b\",label2: \"value2b\", label3: \"value3b\",label4: \"value4b\"},
...
{/literal}{/capture}

如果 label1: \"value1\" 匹配我的字符串,我需要覆盖一系列标签和值(从 { 到 } )。

这是我到目前为止得到的...

{capture assign=foo_regex}{literal}/[{label1:\s*\\"{/literal}{$smarty.get.value1}{literal}\\",\s*label2:\s*\\"{/literal}{$smarty.get.value2}{literal}\\"].*[}]/g{/literal}{/capture}
{capture assign=foo_replace}{literal}{-my new string-}{/literal}{/capture}
{$str|regex_replace:$foo_regex:$foo_replace}

那里有任何向导请帮忙吗?先感谢您 !

更新:我提出了正确的表达式,但它不适用于 Smarty 正则表达式......我做错了什么? http://regexr.com?30dnp

Update2 @ lorenzo:当label1: \"value1\",label2: \"value2\"匹配我的字符串时,我用一个从 { 到 } 的新字符串覆盖它,就像这样{label1: \"value1\",label2: \"value2\",label3: \"value3\",label4: \"value4\"}

它的作用:检查存储的 value1 和 value2 是否与我的测试字符串匹配,如果是肯定的 -> 用我的新字符串值更新所有其他值 (4,5,6)。

希望现在更清楚我想要实现的目标。

4

2 回答 2

1

如果您使用 Smarty3,您可以停止弹奏琴弦并开始使用正确的结构。

{* ordinary array, could've been assign()ed *}
{$labels = [
  "label1" => "value1",
  "label2" => "value2",
  "label3" => "value3",
  "label4" => "value4"
]}

{if $labels.label3 == 'value3'}
 {$labels.label3 = 'hello world'}
{/if}

{$labels|json_encode|escape}

会输出

{"label1":"value1","label2":"value2","label3":"hello world","label4":"value4"}
于 2012-03-23T10:18:32.973 回答
0

解决方案(对于可能需要有关该主题的提示的其他人):

  1. 使用这个有用的在线工具为我的表达获得正确的 php 格式:http ://www.techeden.com/regex

  2. 然后在我的 CMSMS 管理员中创建了一个 php 片段(udt),以便在找到匹配项时从 { 替换为 }:

    $result = preg_replace('/.*(?:label1\: \\\\\"'.$params['value1'].'\\\\\").*(?:label2\: \\\\\"'.$params['value2'].'\\\\\").*[}]/m', $params['replace'], $params['str']);
    
于 2012-03-23T11:10:00.520 回答