Мне было трудно объяснить (и искать), поэтому позвольте мне попробовать пример.
Цель - система шаблонов для nodejs бэкэнда, где я могу заменить пользовательские теги в HTML шаблон с указанным c содержимым на основе определенных параметров, таких как язык.
Простой пример замены:
<h1>{static||header}</h1>
Мой пользовательский тег здесь можно заменить на:
template = template.replace(/{static\|\|(.*?)}/g, (match, $1) => { /* find the variable to replace $1 ("header") with and return */});
Более сложный пример, где я oop через массив:
<ul>{static||items||loop||<li id="%k">%v</li>}</ul>
код для его замены:
template = template.replace(/{static\|\|(.*?)}/g, (match, $1) => {
// static parts
let parts = $1.split("||");
if(parts[1] === "loop"){
/* loop through the "items" array replacing %k and %v as appropriate in parts[2] */
}
});
Но теперь я столкнулся с новым Задача, которую мне нужно решить, и моя способность к регулярным выражениям в некоторой степени отсутствует, чтобы решить эту проблему, поэтому я обращаюсь к StackOverflow за идеями.
Проблема, которую мне нужно решить, - это oop, как указано выше, но внутри этого l oop больше тегов, это могут быть простые замены или зацикленные замены. Суть в том, что регулярному выражению необходимо найти закрывающий} для внешнего тега и игнорировать любые теги и переменные, которые находятся внутри него.
Html пример:
<ul>{static||items||loop||<li id="%k">
<strong>{static||foo}: %v</strong>
<ul>{static||subitems||loop||<li>%v</li>}</ul>
</li>}</ul>
Таким образом, регулярное выражение должно соответствовать первому "{stati c" последнему "}" и игнорировать 2 "{stati c ...}", которые находятся внутри него. Как может регулярное выражение "знать", что правильное закрытие "}" является последним?
Большое спасибо!