任何人都可以帮我解决这个问题......我对正则表达方式不太满意,而且自从几天以来我一直在敲打我的脑袋!
在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)。
希望现在它更清楚我想达到的目标。
答案 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)
解决方案(对于可能需要提示主题的其他人):
使用这个有用的在线工具为我的表达式获取了正确的php格式:http://www.techeden.com/regex
然后在我的CMSMS管理员中创建了一个php代码段(udt),以便在找到匹配项时从{to}替换:
$result = preg_replace('/.*(?:label1\: \\\\\"'.$params['value1'].'\\\\\").*(?:label2\: \\\\\"'.$params['value2'].'\\\\\").*[}]/m', $params['replace'], $params['str']);