2017-02-04 2 views
0

Я задаюсь вопросом, каким образом я мог бы «виджет» выражение из этого куска кода:найти последнее вхождение символов с помощью JavaScript

blablablalbadsj kds {{widget type="Magento\FooBard\Block\Widget\Script" wysywig_text="<img src='{{media url='wysiwyg/something.png'}}' alt='' />"}} ksakkdkkcxz {{media url='wysiwyg/something2.png'}} 

Наконец, я хочу иметь, что:

{{widget type="Magento\FooBard\Block\Widget\Script" wysywig_text="<img src='{{media url='wysiwyg/something.png'}}' alt='' />"}} 

Я думал о том, что и у меня есть регулярное выражение, подобное:

/\{\{widget(.*?)\}}/ 

, но это не работает, я T, только соответствие:

{{widget type="Bold\Gtm\Block\Widget\Script" wysywig_text="<img src='{{media url='wysiwyg/compare_brightness.png'}} 

без: альт = '' />»

+0

Что логика, для которых ''}} должен закончить матч? – Barmar

+0

Вам не нужен последний '}}', и вы не хотите первый '}}'. Как он должен знать, какой из них вам действительно нужен? – Barmar

+0

Если вы хотите сбалансировать '{{' с '}}', регулярные выражения не очень хороши. Вы должны использовать более мощный парсер. – Barmar

ответ

2

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

var str =`blablablalbadsj kds {{widget type="Magento\FooBard\Block\Widget\Script" wysywig_text="<img src='{{media url='wysiwyg/something.png'}}' alt='' />"}} ksakkdkkcxz {{media url='wysiwyg/something2.png'}}` 
 

 
var startWdigetPos = str.indexOf("{{widget"),endWidgetPost = 0; 
 
const regex = /{{|}}/mg; 
 

 

 
var openedTags=0; 
 
var closedTags=0; 
 
while ((m = regex.exec(str.substr(startWdigetPos))) !== null) { 
 
     // This is necessary to avoid infinite loops with zero-width matches 
 
    if (m.index === regex.lastIndex) { 
 
     regex.lastIndex++; 
 
    } 
 
    
 
    if (m[0]=="{{"){ 
 
     openedTags++; 
 
    }else if (m[0]="}}"){ 
 
     closedTags++; 
 
     
 
    } 
 
    if (openedTags === closedTags){ 
 
    endWidgetPost = regex.lastIndex ; 
 
    break; 
 
    } 
 
    
 
} 
 
if (endWidgetPost){ 
 
    console.log(str.substr(startWdigetPos,endWidgetPost)); 
 
}

+0

Это должен быть комментарий. Или дать решение, которое использует синтаксический анализатор. – Toto

+0

Это кажется работающим, +1 – Toto

+0

спаси мой день! спасибо 100 раз! ^^ – corey

Смежные вопросы