如何使用JavaScript从字符串中删除完整标签?

时间:2019-05-16 12:16:24

标签: javascript regex

我的输入如下

input = "hello <script>alert("I am stealing your data");</script>"

我想从字符串中删除完整的脚本标签,并且输出应类似于

output = "hello"

尝试了以下命令,但未删除完整标签。

input.replace(/(<([^>]+)>)/ig, ''));

它给我们结果

"hello alert("I am stealing you data");"

2 个答案:

答案 0 :(得分:5)

您应该为此not use正则表达式。而是使用DOM解析器功能:

var input = 'hello <script\>alert("I am stealing your data");</script\>';

var span = document.createElement("span");
span.innerHTML = input; // This will not execute scripts
// Remove all script tags within this span element:
Array.from(span.querySelectorAll("script"), script => script.remove()); 
// Get the remaining HTML out of it
var scriptless = span.innerHTML;

console.log(scriptless);

请注意,让用户将任意HTML传递给您的应用程序是一个非常糟糕的主意。消毒涉及a lot more,而不仅仅是删除脚本标签。

答案 1 :(得分:0)

您不需要使用正则表达式,因为它们很容易欺骗,不适合解析HTML内容,尤其是不可信的HTML内容。

相反,您可以使用DOMParser创建一个新文档,并使用DOM API删除所有脚本标签,然后返回其余内容:

function sanitise(input) {
  const parser = new DOMParser();
  const doc = parser.parseFromString(input, "text/html");
  
  let scripts = [...doc.getElementsByTagName('script')]
  
  scripts.forEach(script => script.remove());
  
  return doc.body.textContent.trim();
}

//using the + because otherwise StackSnippets breaks
console.log(sanitise("hello <script>alert('I am stealing your data');</scr"+"ipt>"))