2017-02-04 47 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