2017-02-04 62 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'}} 

而不为:ALT = ''/>”

+0

什么是针对'}}'应该结束比赛的逻辑是什么? – Barmar

+0

你不想要最后一个'}}',而你不需要第一个'}}'。它应该如何知道你真的想要哪一个? – Barmar

+0

如果你想平衡'{{'与'}}',正则表达式不擅长。你应该使用更强大的解析器。 – Barmar

回答

2

我的建议是不要使用正则表达式的,因为那个字符串是不正规。所以试图用正则表达式来解析它会非常困难。

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