我正在尝试创建一个可以将几组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
问题-可以在正则表达式中添加什么?
答案 0 :(得分:2)
/<\s*\/?\s*(code|em|ul|br)\b.*?>/
\s*\/?\s*
标签名称前面可能有空格
(code|em|ul|br)\b
仅匹配整个标签名称
.*?>
将所有内容与字符>
答案 1 :(得分:1)
在客户端,使用DOMParser将文本解析为文档,然后使用querySelector
选择不是code
,em
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)");
中包含任何内容,则该字符串包含禁止的元素。