使用正则表达式删除 Javascript 中的 HTML 标记

我试图从 Javascript 中的字符串中移除所有的 html 标记。 这就是我所拥有的... 我不明白为什么它不工作... 有人知道我做错了什么吗?

<script type="text/javascript">


var regex = "/<(.|\n)*?>/";
var body = "<p>test</p>";
var result = body.replace(regex, "");
alert(result);


</script>

非常感谢!

225928 次浏览

试试这个,注意 HTML 的语法太复杂了,正则表达式不可能100% 正确:

var regex = /(<([^>]+)>)/ig
,   body = "<p>test</p>"
,   result = body.replace(regex, "");


console.log(result);

如果您愿意使用像 JQuery这样的库,您可以简单地这样做:

console.log($('<p>test</p>').text());

有关 JS 中适当的 HTML 消毒器,请参见 http://code.google.com/p/google-caja/wiki/JsHtmlSanitizer

这是一个古老的问题,但我无意中发现了它,并想与大家分享一下我使用的方法:

var body = '<div id="anid">some <a href="link">text</a></div> and some more text';
var temp = document.createElement("div");
temp.innerHTML = body;
var sanitized = temp.textContent || temp.innerText;

sanitized现在包含: "some text and some more text"

简单,不需要 jQuery,即使在更复杂的情况下也不应该让您失望。

警告

安全无法处理用户内容,因为它容易受到脚本注入的影响:

var body = '<img src=fake onerror=alert("dangerous")> Hello';
var temp = document.createElement("div");
temp.innerHTML = body;
var sanitized = temp.textContent || temp.innerText;

导致发出警报。

我的 很简单 JavaScript 库 FuncJS 有一个名为“ Strip _ tag ()”的函数,它为您完成任务ーー不需要您输入任何正则表达式。

例如,假设你想从一个句子中移除标签-使用这个函数,你可以像这样做:

strip_tags("This string <em>contains</em> <strong>a lot</strong> of tags!");

这将产生“此字符串包含大量标记!”。

为了更好地理解,请在以下网址阅读文档 GitHub FuncJS .

此外,如果你愿意,请通过表格提供一些反馈。这将是非常有帮助的我!

你可以使用一个强大的管理字符串库是 Undescore.string.js

_('a <a href="#">link</a>').stripTags()

= > 「连结」

_('a <a href="#">link</a><script>alert("hello world!")</script>').stripTags()

= >’一个链接提醒(“你好,世界!”)’

不要忘记导入这个库,如下所示:

        <script src="underscore.js" type="text/javascript"></script>
<script src="underscore.string.js" type="text/javascript"></script>
<script type="text/javascript"> _.mixin(_.str.exports())</script>

所选择的答案并不总是确保 HTML 被剥离,因为仍然可以通过创建如下所示的字符串来构造无效的 HTML 字符串。

  "<<h1>h1>foo<<//</h1>h1/>"

这个输入将确保剥离为您组装一组标记,并将导致:

  "<h1>foo</h1>"

另外,jquery 的 text 函数将去除没有被标记包围的文本。

下面是一个使用 jQuery 的函数,但是对于这两种情况应该更加健壮:

var stripHTML = function(s) {
var lastString;


do {
s = $('<div>').html(lastString = s).text();
} while(lastString !== s)


return s;
};
<html>
<head>
<script type="text/javascript">
function striptag(){
var html = /(<([^>]+)>)/gi;
for (i=0; i < arguments.length; i++)
arguments[i].value=arguments[i].value.replace(html, "")
}
</script>
</head>
<body>
<form name="myform">
<textarea class="comment" title="comment" name=comment rows=4 cols=40></textarea><br>
<input type="button" value="Remove HTML Tags" onClick="striptag(this.form.comment)">
</form>
</body>
</html>

这招对我很管用。

   var regex = /(&nbsp;|<([^>]+)>)/ig
,   body = tt
,   result = body.replace(regex, "");
alert(result);

正如其他人所说的那样,regex 不会起作用。花点时间读读我的 文章,它告诉我为什么不能也不应该尝试用正则表达式解析 html,当您试图从源字符串中去除 html 时就是这样做的。

下面是文本角度(WYSISYG 编辑器)是如何做到这一点。我还发现这是最一致的答案,这是没有正则表达式。

@license textAngular
Author : Austin Anderson
License : 2013 MIT
Version 1.5.16
// turn html into pure text that shows visiblity
function stripHtmlToText(html)
{
var tmp = document.createElement("DIV");
tmp.innerHTML = html;
var res = tmp.textContent || tmp.innerText || '';
res.replace('\u200B', ''); // zero width space
res = res.trim();
return res;
}

我做事的方式简直就是一句俏皮话。

该函数创建一个 范围对象,然后在 Range 中创建一个 文件碎片,其中字符串作为子内容。

然后它抓取片段的文本,删除任何“不可见”/零宽度字符,并修剪任何前/后的空白。

我意识到这个问题已经过时了,我只是觉得我的解决方案很独特,想和大家分享一下:)

function getTextFromString(htmlString) {
return document
.createRange()
// Creates a fragment and turns the supplied string into HTML nodes
.createContextualFragment(htmlString)
// Gets the text from the fragment
.textContent
// Removes the Zero-Width Space, Zero-Width Joiner, Zero-Width No-Break Space, Left-To-Right Mark, and Right-To-Left Mark characters
.replace(/[\u200B-\u200D\uFEFF\u200E\u200F]/g, '')
// Trims off any extra space on either end of the string
.trim();
}


var cleanString = getTextFromString('<p>Hello world! I <em>love</em> <strong>JavaScript</strong>!!!</p>');


alert(cleanString);

这是一个 HTML 标记和 & nbsp 等的解决方案,您可以删除和添加条件 得到没有 HTML 的文本,你可以用任何。

convertHtmlToText(passHtmlBlock)
{
str = str.toString();
return str.replace(/<[^>]*(>|$)|&nbsp;|&zwnj;|&raquo;|&laquo;|&gt;/g, 'ReplaceIfYouWantOtherWiseKeepItEmpty');
}

如果您希望使用库进行此操作,而不使用 JQuery,那么专门用于此目的的最佳 JS 库是 脱衣服标签

它比正则表达式(17.9 kb)更重,但是如果您需要比正则表达式提供/不关心额外的17.6 kb 更高的安全性,那么它是最佳解决方案。