【问题标题】:Regex for HTML outside markdown code block标记代码块外的 HTML 正则表达式
【发布时间】:2017-05-03 13:38:05
【问题描述】:

我有一个包含一些降价的文本区域。我不希望用户在其中发布 html,除非它位于 markdown 代码块中,例如

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

我不想在 markdown 代码块之外允许任何 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>
```

我能够获得单行 html 标记的正则表达式。 &lt;([a-zA-Z][a-zA-Z0-9]*)\b[^&gt;]*&gt;(.*?)&lt;\/\1&gt;

我做不到

  1. 得到一个支持多行html标签的正则表达式和
  2. 检查该html是否在markdown代码块之外。

我已经创建了一个jsfiddle 来解决这个问题,它显示了应该匹配或应该被拒绝的内容。

我这样做是为了避免明显的 XSS 注入。

【问题讨论】:

标签: javascript html regex xss


【解决方案1】:

正如评论中已经提到的那样,您不应该尝试使用正则表达式解析整个 HTML。我认为您只想在最后剥离标签并将其标记为无效。我创建了一个jsfiddle,我在其中放置了一些解析结构的代码,并让您可以在降价区域或外部应用您的代码:

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('```');
}

【讨论】:

  • 感谢这种方法。我试过我的jsfiddle,它通过了我需要它通过的测试:D
猜你喜欢
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 2015-04-24
  • 1970-01-01
相关资源
最近更新 更多