Javascript регулярное выражение соответствует пользовательским тегам внешняя / внутренняя проблема - PullRequest
1 голос
/ 12 апреля 2020

Мне было трудно объяснить (и искать), поэтому позвольте мне попробовать пример.

Цель - система шаблонов для 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 ...}", которые находятся внутри него. Как может регулярное выражение "знать", что правильное закрытие "}" является последним?

Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...