2016-12-18 10 views
0

私はいくつかのマークダウンを含むテキストエリアを持っています。私はそれが私が値下げコードブロック外の任意のHTMLを許可したくないマークアップコードブロック外のHTMLの正規表現

``` someLanguageCode 
<span>some html inside markdown code block</span> 
``` 

のように値下げコードブロック内にある場合を除き、ユーザーは、それにHTMLを投稿する必要はありません。これは違法です:

<span>some html tag outside code block</span> 
<div>some more multiline html code outside 
</div> 
``` someLanguageCode 
<span>some html inside markdown code block</span> 
``` 

1行のhtmlタグの正規表現を取得することができました。 <([a-zA-Z][a-zA-Z0-9]*)\b[^>]*>(.*?)<\/\1>

私はそのHTMLが外値下げコードブロックであるかどうかを確認するために、複数行のHTMLタグと

  • をサポートして正規表現を取得

    1. することができません。

    この問題を解決するために、私はjsfiddleを試しました。この問題は、どのようなものが拒否されるべきかを示しています。

    明らかなXSS注射を避ける試みとしてこれをやっています。

  • +0

    http://stackoverflow.com/a/1732454/:私は構造を解析し、あなたの値下げエリア、または外部のコードを適用する可能性を与え、いくつかのコードを入れてjsfiddleを作成しました正規表現で[X] HTMLを解析する。 –

    答えて

    2

    コメントで既に述べたように、HTML全体を正規表現で解析しないでください。私はあなたが最後にタグを取り除き、それが有効でないとマークしたいと思うと思う。あなたは「でき

    var valid = '``` someLanguageCode'+ 
    '<span>some html inside markdown code block</span>'+ 
    '```'; // Valid string 
    var broken = '``` someLanguageCode'+ 
    '<span>some html inside markdown code block</span>'; //Markdown not closed (broken string) 
    var not_valid = '<span>Me is outside.</span>'+ 
    '``` someLanguageCode'+ 
    '<span>some html inside markdown code block</span>'+ 
    '```'; // Not valid string 
    
    var s = not_valid; //Change this to test 
    
    document.getElementById('code').innerHTML = check_html_in_markdown(s); 
    
    function check_html_in_markdown(s){ 
        s = s.split(/```/); 
        //Check if markdown blocks are closed correctly 
        var is_broken = false; 
        if(s.length % 2 == 0){ //odd number of markdown ``` means not closed 
        is_broken = true; 
        alert('Markown is broken'); 
        } 
    
        if(!is_broken){ 
        var in_markdown = false; 
        for(var i in s){ 
         in_markdown = i % 2 == 1; 
         if(!in_markdown){ 
         //Code to find HTML-Tags and replace them 
         s[i] = s[i].replace(/<[a-z\/][^>]*>/g, ' **Your replacement** '); 
         } else { 
         //Here you can do nothing or check with a HTML-Parser if there is valied HTML 
         } 
        } 
        } 
        return s.join('```'); 
    } 
    
    +0

    このアプローチに感謝します。私は私の[jsfiddle](https://jsfiddle.net/cgxonw1x/12/)を試して、テストに合格する必要があります:D –

    関連する問題