从文本 JavaScript 中剥离 HTML

IT技术 javascript html string
2021-01-12 20:43:02

有没有一种简单的方法可以在 JavaScript 中获取一串 html 并去掉 html?

6个回答

如果您在浏览器中运行,那么最简单的方法就是让浏览器为您完成...

function stripHtml(html)
{
   let tmp = document.createElement("DIV");
   tmp.innerHTML = html;
   return tmp.textContent || tmp.innerText || "";
}

注意:正如人们在评论中指出的那样,如果您不控制 HTML 的来源(例如,不要在可能来自用户输入的任何内容上运行它),最好避免这种情况。对于这些场景,您仍然可以让浏览器为您完成工作 -请参阅 Saba 关于使用现已广泛使用的 DOMParser 的回答

@Magnus Smith:是的,如果空格是一个问题 - 或者实际上,如果您需要这个不直接涉及您正在使用的特定 HTML DOM 的文本 - 那么您最好使用另一个这里给出的解决方案。这种方法的主要优点是 1) 微不足道,和 2) 将可靠地处理标签、空白、实体、评论等,以与您正在运行的浏览器相同的方式这对于 Web 客户端代码通常很有用,但不一定适合与规则不同的其他系统进行交互。
2021-03-16 20:43:02
请记住,您的空格会被弄乱。我曾经使用这种方法,然后遇到了一些问题,因为某些产品代码包含双空格,在我从 DIV 取回 innerText 后,这些代码最终变成了单空格。然后产品代码在应用程序后期不匹配。
2021-03-20 20:43:02
不要将它与来自不受信任来源的 HTML 一起使用。要了解原因,请尝试运行strip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")
2021-03-25 20:43:02
如果 html 包含图像(img 标签),则浏览器将请求图像。这不好。
2021-03-31 20:43:02
请记住,这种方法相当不一致,并且无法在某些浏览器中去除某些字符。例如,在 Prototype.js 中,我们使用这种方法来提高性能,但解​​决了一些不足之处 - github.com/kangax/prototype/blob/...
2021-04-05 20:43:02
myString.replace(/<[^>]*>?/gm, '');
<img src=http://www.google.com.kh/images/srpr/nav_logo27.png onload="alert(42)" 如果您在注入 via之前注入 viadocument.write或与包含 a 的字符串连接,不起作用>innerHTML
2021-03-09 20:43:02
@AntonioMax,我已经回答了这个问题令人作呕,但对于您问题的实质,因为不应复制和粘贴安全关键代码。 您应该下载一个库,并使其保持最新和打补丁,这样您就可以免受最近发现的漏洞和浏览器更改的影响。
2021-03-13 20:43:02
@MikeSamuel 我们决定这个答案了吗?天真的用户在这里准备复制粘贴。
2021-03-26 20:43:02
我相信,如果给出类似<button onClick="dostuff('>');"></button>假设正确编写的 HTML,您仍然需要考虑到一个大于号可能出现在属性中引用文本的某处,这也会完全混淆此外,您<script>至少希望删除标签内的所有文本
2021-04-04 20:43:02
@PerishableDave,我同意>将留在第二个。不过,这不是注射危险。由于<第一个中的 left发生了危险,这导致 HTML 解析器在第二个启动时处于数据状态以外的上下文中请注意,没有从 上的数据状态转换>
2021-04-08 20:43:02

最简单的方法:

jQuery(html).text();

它从一串 html 中检索所有文本。

@Dementic 令人震惊的是,我发现有多个答案的线程最有用,因为次要答案通常满足我的确切需求,而主要答案满足一般情况。
2021-03-10 20:43:02
您使用它,但 OP 可能不会。问题是关于 Javascript 而不是 JQuery。
2021-03-12 20:43:02
我们总是在项目中使用 jQuery,因为我们的项目总是有很多 Javascript。因此我们没有添加批量,而是利用了现有的 API 代码......
2021-03-23 20:43:02
对于需要与 OP 做同样的事情(像我一样)并且不介意使用 jQuery(像我)的人来说,这仍然是一个有用的答案,更不用说,如果他们考虑使用它可能对 OP 有用jQuery。该网站的重点是分享知识。请记住,在没有充分理由的情况下批评有用的答案可能会产生令人不寒而栗的效果。
2021-04-05 20:43:02
如果您的字符串的某些部分没有包含在 html 标签中,那将不起作用。例如“<b>错误:</b>请输入有效的电子邮件”将仅返回“错误:”
2021-04-05 20:43:02

我想分享Shog9批准的答案的编辑版本


正如Mike Samuel在评论中指出的那样,该函数可以执行内联 javascript 代码。
但是Shog9说“让浏览器为你做这件事......”是对的。

所以..这里是我编辑过的版本,使用DOMParser

function strip(html){
   let doc = new DOMParser().parseFromString(html, 'text/html');
   return doc.body.textContent || "";
}

这里是测试内联javascript的代码:

strip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")

此外,它不会在解析时请求资源(如图像)

strip("Just text <img src='https://assets.rbl.ms/4155638/980x.jpg'>")
此外,它不会尝试使用正则表达式解析 html
2021-03-12 20:43:02
这似乎是很多比@ Shog9的回答快
2021-03-15 20:43:02
请注意,这也会从文本开头删除空格。
2021-03-20 20:43:02
这不是剥离标签,而是更像 PHP htmlspecialchars()。对我还是有用的。
2021-03-25 20:43:02
值得补充的是,此解决方案仅适用于浏览器。
2021-03-30 20:43:02

作为 jQuery 方法的扩展,如果您的字符串可能不包含 HTML(例如,如果您试图从表单字段中删除 HTML)

jQuery(html).text();

如果没有 HTML 将返回一个空字符串

用:

jQuery('<p>' + html + '</p>').text();

反而。

更新: 正如评论中指出的那样,在某些情况下,html如果 的值html可能受到攻击者的影响,此解决方案将执行其中包含的 javascript ,请使用不同的解决方案。

这仍然执行可能危险的代码 jQuery('<span>Text :) <img src="a" onerror="alert(1)"></span>').text()
2021-03-25 20:43:02
或者 $("<p>").html(html).text();
2021-03-28 20:43:02
试试 jQuery("aa<script>alert(1)</script>a").text();
2021-03-28 20:43:02