2013-06-25 3 views
4

У меня есть довольно много шаблонов, которые используют теги усов, чтобы определить, где разместить пользовательские данные. Эти шаблоны хранятся в виде строки.Как систематически заменить текст в тегах усов в большом тексте?

Когда я вызываю функцию рендеринга внутри усов, я питаюсь сложным объектом JSON, который содержит несколько массивов обеих строк и поддокументов.

я неправильно объявлен в пределах усов тега использовать определенный элемент в пределах массива следующим образом:

{{dataElementArray[2].subElement}} 
{{anotherElement.dataArray[1]}} 

Вместо этого я хотел бы изменить все вхождения в пределах каждого шаблона для надлежащего синтаксиса усов для адресации элементов, такие как так:

{{dataElementArray.2.subElement}} 
{{anotherElement.dataArray.1}} 

Какой самый лучший способ систематически пройти через каждый шаблон (представленный в виде строки) и использовать регулярное выражение, чтобы изменить то, что в каждом теге? У меня более 50 шаблонов, большинство из которых содержат сотни строк с сотнями тегов в каждом из них.

Я использую JavaScript/Node.js для этого приложения.

ответ

5

Это жесткая (но не невозможно) задача сделать с одним регулярным выражением. К счастью, нет причин, по которым мы должны делать это с помощью одного. Гораздо проще (и более надежный) подход состоит в том, чтобы использовать два регулярных выражения: один для соответствия замещающим тэгам (вещи, содержащиеся в {{curly brackets}}), а другой - для замены экземпляров индексов индексов с индексаторами индексов. Вот мое решение:

s.replace(/\{\{(.*?)\}\}/g, function(x){   // this grabs replacement tags 
    return x.replace(/\[(\d+)\]/g,'.$1')});  // this replaces array indexers 

Примечание: Я не анализировали это решение с entire mustache syntax, поэтому я не могу гарантировать, что это будет работать, если вы используете более стандартных тегов.

+0

Awesome. Казалось, это отлично работает! Я создал [jsFiddle] (http://jsfiddle.net/VrbV4/) для других, чтобы увидеть этот код в действии. Большое спасибо! – reedog117

1

Описание

Это выражение будет соответствовать первой цифры в квадратные скобки внутри скобок усов, он также проверяет квадратные скобки следуют либо точкой или близкого усов кронштейна.

Используйте это регулярное выражение: (\{\{[a-z.]*[a-z])\[(\d+)\](?=\.|\})([a-z.]*\}\})

С этой замены: $1.$2$3

enter image description here

Javascript Пример кода:

http://www.myregextester.com/?r=f9e362af

Ввод пробы

{{dataElementArray[2].subElement}} 
{{anotherElement.dataArray[1]}} 
{{alreadyFormatted.dataArray.1}} 

Код

<script type="text/javascript"> 
    var re = /(\{\{[a-z.]*[a-z])\[(\d+)\](?=\.|\})([a-z.]*\}\})/; 
    var sourcestring = "source string to match with pattern"; 
    var replacementpattern = "$1.$2$3"; 
    var result = sourcestring.replace(re, replacementpattern); 
    alert("result = " + result); 
</script> 

После замены

{{dataElementArray.2.subElement}} 
{{anotherElement.dataArray.1}} 
{{alreadyFormatted.dataArray.1}} 
+0

Я просто попробовал ваш пример, и это проблематично, потому что он заменит только последний индекс индекса. Например, ваше решение не будет выполнено на этом входе: '{{outer [3] .inner [2]}}'.Кроме того, он будет терпеть неудачу, если в строке будет несколько тегов (например, просто введите ваш образец в одну строку, а не на несколько строк). Я считаю, что мое решение более надежное. –

+0

Этот краевой случай не обсуждался в ОП. –

+0

В OP не упоминается множество индексировщиков массивов в одном и том же теге, это правда, но вы не можете сделать вывод из OP, что в одной строке не будет нескольких тегов. –