2016-11-13 11 views
2

Rich Text Editorを使用して、Twigテンプレートのオンライン修正を許可します。小枝は、変数を表示するには、次の構文を使用して、テンプレートエンジンされています。今、私が欲しいものを次の私のエディタに、表示することですTwigのJavascript正規表現テンプレートの内容

{{ url('mr_message_read', {id: message.id}) }} 

{{ object.property }} 

それはまたのようなURLを生成する機能を使用していますTWIG変数の関数のリストがテンプレートで使用されています。このために、私は上記のように "キーワード"の小枝を持つHTMLとして現在のコンテンツを取得します。キーワードを抽出するために、私は下の正規表現を使用する:小枝機能が}文字列を必要とする

var reg = /{{[^}]+}}/g; 
var match = text.match(reg); 
console.log(match); 

これは、1なく例えば2作業例を動作します。だから、私は "以外のもの}}"を許可するいくつかの他の構文を試しました。いずれもフィットしていないようです:

var reg = /{{[^}]+}}/g; // GOOD but ignores second example 
    var reg = /{{[^}}]+}}/g; // Idem 
    var reg = /{{[^}}]*}}/g; // Idem 
    var reg = /{{(^}}+)}}/; // null 
    var reg = /{{(^}})+}}/; // null 
    var reg = /\{\{[^\}\}]+\}\}/g; // Ignores second example 
    var reg = /\{\{[^}}]+\}\}/g; // Ignores second example 
    var reg = /\{\{[^\}\}]+\}\}/g; // Ignores second example 
    var reg = /\{\{[^[}}]]+\}\}/g; // Ignores second example 

私は今苦労しています。私はそれがエスケープの問題だと思うが、私は:)

サンプルコンテンツこだわっている:

<p>{{ author.fullname }} wrote you a message. Read it here: <a href="{{ url('mr_message_read', {id: message.id}) }}">Messagerie</a>.</p> 
<hr /> 
<blockquote> 
<p>{{ message.content|nl2br }}</p> 
</blockquote> 

EDIT:トーマス・コードに基づいて、私のソリューション

function getTwigTags(){ 

    var str = CKEDITOR.instances['form_content'].getData(); 
    var regex = /{{\s*([^{]*{([^{]*):\s*(.*?)}.*?|[^{]*)\s*}}/g; 
    var keywords = new Array(); 
    let m; 

    while ((m = regex.exec(str)) !== null) { 
     // This is necessary to avoid infinite loops with zero-width matches 
     if (m.index === regex.lastIndex) { 
      regex.lastIndex++; 
     } 

     // The result can be accessed through the `m`-variable. 
     m.forEach((match, groupIndex) => { 
      if(match !== 'undefined' && groupIndex == 1) 
       // console.log(`Found match: group ${groupIndex}: ${match}`); 
       keywords[keywords.length] = match; 
     }); 
    } 

    return keywords; 
} 
+1

理由だけではなく、[ '{{(。*?)}}'](https://regex101.com/r/Ax9uWQ/2)? –

+0

'?{(。*)}}'のような踏み台がなければ、欲張りが減ります。私はこのケースでは怠け者である必要はないと思う。 –

+0

「すべて」セレクタを使用すると、質問に追加したサンプルコンテンツで奇妙な結果が得られます。最初のタグと2番目のタグの両方を取得して2つの結果が得られます。 – LoicPenn

答えて

1

このコードを使用することができます:

const regex = /{{\s*([^{]*{([^{]*):\s*(.*?)}.*?|[^{]*)\s*}}/g; 
 
const str = `{{ url('mr_message_read', {id: message.id}) }} 
 
{{ object.property }}`; 
 
let m; 
 

 
while ((m = regex.exec(str)) !== null) { 
 
    // This is necessary to avoid infinite loops with zero-width matches 
 
    if (m.index === regex.lastIndex) { 
 
     regex.lastIndex++; 
 
    } 
 
    
 
    // The result can be accessed through the `m`-variable. 
 
    m.forEach((match, groupIndex) => { 
 
     if(match !== 'undefined' && groupIndex > 0) 
 
     console.log(`Found match: group ${groupIndex}: ${match}`); 
 
    }); 
 
}

+0

Hm、ほとんど。文字列でコードを試してみると、最初の結果は不正確で、1つの文字列に2つの最初のキーワードがキャッチされます。私は今サンプルの文字列を私の質問に追加しています。 – LoicPenn

+0

@LoicPenn編集参照: –

+0

あなたは男です:) – LoicPenn