У меня есть это регулярное выражение для сканирования каждого цикла в моих представлениях, оно почти делает то, что я хочу, но не полностью. Я использую это регулярное выражение atm:
(?=({{each\s+([^{}]*)}}((?>(?!{{#?each).|(?1))*){{#each}}))
Когда у меня есть каждый цикл внутри другого каждого цикла, он показывает совпадения правильно, но я не хочу, чтобы каждый цикл был внутренним. Я планирую обработать этот второй матч рекурсивно. Вот пример HTML:
<div class="rows-container">
{{each infoItems}}
<div class="row">
<div class="row-key"></div>
</div>
<div class="sub-container">
{{each subItems}}
<div class="row">
<div class="row-key"></div>
</div>
{{#each}}
</div>
{{#each}}
</div>
<div class="rows-container">
{{each newsItems}}
<div class="row">
<div class="row-key"></div>
</div>
{{#each}}
</div>
Будет давать следующие результаты:
//MATCH 1:
1. {{each infoItems}} <div class="row"> <div class="row-key"></div> </div> <div class="sub-container"> {{each subItems}} <div class="row flex-wrap"> <div class="row-key"></div> </div> {{#each}} </div> {{#each}}
2. infoItems
3. <div class="row"> <div class="row-key"></div> </div> <div class="sub-container"> {{each subItems}} <div class="row flex-wrap"> <div class="row-key"></div> </div> {{#each}} </div>//MATCH 2:
//This is the match I was trying to exclude:
4. {{each subItems}} <div class="row flex-wrap"> <div class="row-key"></div> </div> {{#each}}
5. subItems
6. <div class="row flex-wrap"> <div class="row-key"></div> </div>
//MATCH 3:
7. {{each newsItems}} <div class="row"> <div class="row-key"></div> </div> {{#each}}
8. newsItems
9. <div class="row"> <div class="row-key"></div> </div>
Как видите, все, что мне нужно, это: полный результат (который полезен для обратного вызова замены), имя массива, & содержимое. Я пытался озадачить регулярным выражением,
{{each\s+([^{}]*)}}((?>(?!{{#?each).|(?1))*){{#each}}
Это даст только 2-й & третий, но не первый = ‘(я начинаю думать, что я слишком занят с регулярными выражениями этого комплекса, теряя понимание их … но мне нравится подталкивать вещи.
Есть ли способ захватить 1-й и 3-й матч? с разрешением внутри каждого другого цикла (только 1 внутри требуется .. на данный момент), но не сопоставляя их.
Небольшое объяснение или обратная связь будут очень благодарны, но у меня есть немного времени, и меня ждет головоломка.
Задача ещё не решена.
Других решений пока нет …