Smarty regex_replace匹配带有大括号的表达式

时间:2012-03-22 15:48:09

标签: regex smarty curly-braces curly-brackets

任何人都可以帮我解决这个问题......我对正则表达方式不太满意,而且自从几天以来我一直在敲打我的脑袋!

在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 \"我需要覆盖一系列标签和值(来自{to})匹配我的字符串。

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

{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\"与我的字符串匹配时,我使用来自{to}的新字符串覆盖它,例如{label1: \"value1\",label2: \"value2\",label3: \"value3\",label4: \"value4\"}

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

希望现在它更清楚我想达到的目标。

2 个答案:

答案 0 :(得分: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"}

答案 1 :(得分:0)

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

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

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

    $result = preg_replace('/.*(?:label1\: \\\\\"'.$params['value1'].'\\\\\").*(?:label2\: \\\\\"'.$params['value2'].'\\\\\").*[}]/m', $params['replace'], $params['str']);