2012-03-22 88 views
0

任何人都可以請幫助我這個......我不是很擅長正則表達式,並且自從天以來我一直在敲我的腦袋!Smarty regex_replace與大括號表達式匹配的表達式

在Smarty的我有包含在變量$ STR捕獲大括號此數組O值:

{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 @羅倫佐:當label1: \"value1\",label2: \"value2\"我的字符串我有一個新的字符串從{到}覆蓋它匹配這樣{label1: \"value1\",label2: \"value2\",label3: \"value3\",label4: \"value4\"}

它所做的:如果爲正檢查存儲值1和值2符合我的測試字符串 - >用我的新字符串值更新所有其他值(4,5,6)。

希望現在更清楚我想達到什麼。

+0

爲什麼你要讓它在Smarty的?你不能用PHP或JS做它嗎(它似乎是JSON,不是嗎?)? – 2012-03-22 17:23:48

+0

我想我可以使用PHP來寫一個聰明的插件。我在我的smarty模板中收到這些數據。 – Tron 2012-03-22 18:00:32

+0

好的。通過更好的縮進改善您的問題,不僅提供輸入,還提供確切的期望輸出。 – 2012-03-22 18:15:14

回答

0

解決方案(爲別人誰可能需要對這個問題的提示):

  1. 得到了正確的PHP這個有用的在線工具,我的表達格式:http://www.techeden.com/regex

  2. 然後在我的C中創建了一個php代碼片段(udt) MSMS管理,以取代從{}到匹配時發現:

    $result = preg_replace('/.*(?:label1\: \\\\\"'.$params['value1'].'\\\\\").*(?:label2\: \\\\\"'.$params['value2'].'\\\\\").*[}]/m', $params['replace'], $params['str']); 
    
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"} 
+0

是的。使用Smarty3會很棒! ;-) – Tron 2012-03-23 11:02:12