正则表达式将HTML标签列入白名单

时间:2019-12-24 07:52:34

标签: javascript html regex

我正在尝试创建一个可以将几组html标签列入白名单的正则表达式。

/<(\/)?(code|em|ul)(\/)?>$/

但是在少数情况下失败了:

<em style="padding: 10px">

尝试了/<(\/)?(code|em|ul)(.|\n)*?(\/)?>$/,但这也允许

<emadchgasgh style="padding: 10px">

需要列入白名单的案例:

<em> - Success
</em> - Success
<br/> - Success
<em style="asdcasc"> - Success
<emacjhasjdhc> - Failure

问题-可以在正则表达式中添加什么?

2 个答案:

答案 0 :(得分:2)

/<\s*\/?\s*(code|em|ul|br)\b.*?>/

\s*\/?\s*标签名称前面可能有空格
(code|em|ul|br)\b仅匹配整个标签名称
.*?>将所有内容与字符>

匹配

答案 1 :(得分:1)

在客户端,使用DOMParser将文本解析为文档,然后使用querySelector选择不是codeem ul或{{ 1}}和查询字符串:

br

如果返回任何内容,则字符串不通过。

*:not(code):not(em):not(ul):not(br)

在Java中,您可以使用Jsoup来解析给定的HTML字符串,然后可以选择其中的元素,例如:

const test = (str) => {
  const doc = new DOMParser().parseFromString(str, 'text/html');
  return !doc.body.querySelector('*:not(code):not(em):not(ul):not(br)');
};

console.log(test('foo <br> bar'));
console.log(test('foo <code>code here</code> bar <br>'));
console.log(test('foo <div>not allowed</div>'));

如果Document doc = Jsoup.parse(input); Elements forbiddenElements = doc.select("*:not(code):not(em):not(ul):not(br)"); 中包含任何内容,则该字符串包含禁止的元素。