我有一个包含一些 Markdown 的文本区域。我不希望用户在其中发布 html,除非它位于 markdown 代码块内,例如
``` someLanguageCode
<span>some html inside markdown code block</span>
```
我不想允许任何 html 位于 markdown 代码块之外。所以这是非法的:
<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 标签的正则表达式。 <([a-zA-Z][a-zA-Z0-9]*)\b[^>]*>(.*?)<\/\1>
我无法
- 获取支持多行 html 标签的正则表达式和
- 检查该 html 是否位于 Markdown 代码块之外。
我做了一个jsfiddle解决这个问题,它显示什么应该匹配或应该被拒绝。
我这样做是为了避免明显的 XSS 注入(inject)。
最佳答案
正如评论中已经提到的,您不应该尝试使用正则表达式解析整个 HTML。我想你只是想最后去掉标签并将其标记为无效。我创建了一个jsfiddle我在其中放置了一些解析结构的代码,并使您可以在 Markdown 区域或外部应用代码:
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('```');
}
关于javascript - Markdown 代码块之外的 HTML 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41206721/