Smarty regex_replace соответствие выражения с фигурными скобками - PullRequest
0 голосов
/ 22 марта 2012

Может кто-нибудь, пожалуйста, помогите мне с этим ... Я не очень хорош с регулярными выражениями, и я бьюсь головой со дня!

В 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 regex ... что я делаю не так? http://regexr.com? 30dnp

Update2 @ lorenzo: когда label1: \"value1\",label2: \"value2\" совпадает с моей строкой, я перезаписываю ее новой строкой из {в}, как это {label1: \"value1\",label2: \"value2\",label3: \"value3\",label4: \"value4\"}

Что он делает: проверяет, соответствуют ли сохраненные значения1 и значение2 моей тестовой строке, если она положительная -> обновите все другие значения (4,5,6) моими новыми строковыми значениями.

Надеюсь, теперь стало яснее, чего я хочу достичь.

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Если вы используете 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 голосов
/ 23 марта 2012

Решение (для других, кому может понадобиться подсказка по теме):

  1. получил правильное форматирование php для моего выражения с помощью этого полезного онлайн-инструмента: http://www.techeden.com/regex

  2. затем создал php-фрагмент (udt) в моем администраторе CMSMS для замены с {на} при обнаружении совпадения:

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