有一种简单的方法可以在JavaScript中获取一串html并删除html吗?
答案 0 :(得分:678)
如果您在浏览器中运行,那么最简单的方法就是let the browser do it for you...
function strip(html)
{
var tmp = document.createElement("DIV");
tmp.innerHTML = html;
return tmp.textContent || tmp.innerText || "";
}
注意:正如大家在评论中指出的那样,如果您不控制HTML的来源(例如,不要在可能来自用户输入的任何内容上运行此操作),最好避免这种情况。对于这些情况,您可以仍然让浏览器为您完成工作 - see Saba's answer on using the now widely-available DOMParser。
答案 1 :(得分:485)
myString.replace(/<[^>]*>?/gm, '');
答案 2 :(得分:230)
最简单的方法:
jQuery(html).text();
从一串html中检索所有文本。
答案 3 :(得分:73)
我想分享Shog9's approved answer的编辑版本。
正如 Mike Samuel 指出评论一样,该函数可以执行内联javascript代码。
但 Shog9 在说&#34;让浏览器为你做的时候是对的......&#34;
所以..这里是我编辑的版本,使用DOMParser:
function strip(html){
var 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'>")
答案 4 :(得分:52)
作为jQuery方法的扩展,如果你的字符串可能不是contian HTML(例如,如果你试图从表单字段中删除HTML)
jQuery(html).text();
将返回一个空字符串
使用:
jQuery('<p>' + html + '</p>').text();
代替。
<强>更新强>
正如评论中指出的那样,在某些情况下,如果html
的值受到攻击者的影响,此解决方案将执行html
中包含的javascript,请使用其他解决方案。
答案 5 :(得分:35)
由hypoxide发布的上述函数工作正常,但我之前基本上转换了在Web RichText编辑器(例如FCKEditor)中创建的HTML并清除了所有HTML,但由于我想要两者而留下所有链接HTML和纯文本版本,以帮助创建STMP电子邮件的正确部分(HTML和纯文本)。
经过很长一段时间自己搜索谷歌,我的同事们在Javascript中使用正则表达式引擎想出了这个:
str='this string has <i>html</i> code i want to <b>remove</b><br>Link Number 1 -><a href="http://www.bbc.co.uk">BBC</a> Link Number 1<br><p>Now back to normal text and stuff</p>
';
str=str.replace(/<br>/gi, "\n");
str=str.replace(/<p.*>/gi, "\n");
str=str.replace(/<a.*href="(.*?)".*>(.*?)<\/a>/gi, " $2 (Link->$1) ");
str=str.replace(/<(?:.|\s)*?>/g, "");
str
变量的开头如下:
this string has <i>html</i> code i want to <b>remove</b><br>Link Number 1 -><a href="http://www.bbc.co.uk">BBC</a> Link Number 1<br><p>Now back to normal text and stuff</p>
然后在代码运行后它看起来像这样: -
this string has html code i want to remove
Link Number 1 -> BBC (Link->http://www.bbc.co.uk) Link Number 1
Now back to normal text and stuff
正如您所看到的,已删除所有HTML并且链接已被保留,超链接文本仍然完好无损。此外,我已将<p>
和<br>
标记替换为\n
(换行符字符),以便保留某种可视格式。
要更改链接格式(例如BBC (Link->http://www.bbc.co.uk)
),只需修改$2 (Link->$1)
,其中$1
是href网址/ URI,$2
是超链接文字。通过直接在纯文本正文中的链接,大多数SMTP邮件客户端都会转换这些链接,以便用户可以单击它们。
希望你觉得这很有用。
答案 6 :(得分:31)
对已接受答案的改进。
function strip(html)
{
var tmp = document.implementation.createHTMLDocument("New").body;
tmp.innerHTML = html;
return tmp.textContent || tmp.innerText || "";
}
这样运行的东西不会造成伤害:
strip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")
Firefox,Chromium和Explorer 9+都很安全。 Opera Presto仍然很脆弱。 此外,字符串中提到的图像不会在Chromium和Firefox中下载,也不会保存http请求。
答案 7 :(得分:18)
这应该适用于任何Javascript环境(包括NodeJS)。
text.replace(/<[^>]+>/g, '');
答案 8 :(得分:15)
我更改Jibberboy2000's answer以包含多个<BR />
代码格式,删除<SCRIPT>
和<STYLE>
代码中的所有内容,通过删除多个换行符和空格并转换格式化生成的HTML一些HTML编码的代码正常。经过一些测试后,您可以将大多数完整网页转换为简单文本,其中保留页面标题和内容。
在简单的例子中,
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<!--comment-->
<head>
<title>This is my title</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style>
body {margin-top: 15px;}
a { color: #D80C1F; font-weight:bold; text-decoration:none; }
</style>
</head>
<body>
<center>
This string has <i>html</i> code i want to <b>remove</b><br>
In this line <a href="http://www.bbc.co.uk">BBC</a> with link is mentioned.<br/>Now back to "normal text" and stuff using <html encoding>
</center>
</body>
</html>
变为
这是我的头衔
此字符串包含我要删除的HTML代码
在这一行中,提到了带有链接的BBC(http://www.bbc.co.uk)。
现在回到“普通文本”和使用
的东西
JavaScript函数和测试页面看起来:
function convertHtmlToText() {
var inputText = document.getElementById("input").value;
var returnText = "" + inputText;
//-- remove BR tags and replace them with line break
returnText=returnText.replace(/<br>/gi, "\n");
returnText=returnText.replace(/<br\s\/>/gi, "\n");
returnText=returnText.replace(/<br\/>/gi, "\n");
//-- remove P and A tags but preserve what's inside of them
returnText=returnText.replace(/<p.*>/gi, "\n");
returnText=returnText.replace(/<a.*href="(.*?)".*>(.*?)<\/a>/gi, " $2 ($1)");
//-- remove all inside SCRIPT and STYLE tags
returnText=returnText.replace(/<script.*>[\w\W]{1,}(.*?)[\w\W]{1,}<\/script>/gi, "");
returnText=returnText.replace(/<style.*>[\w\W]{1,}(.*?)[\w\W]{1,}<\/style>/gi, "");
//-- remove all else
returnText=returnText.replace(/<(?:.|\s)*?>/g, "");
//-- get rid of more than 2 multiple line breaks:
returnText=returnText.replace(/(?:(?:\r\n|\r|\n)\s*){2,}/gim, "\n\n");
//-- get rid of more than 2 spaces:
returnText = returnText.replace(/ +(?= )/g,'');
//-- get rid of html-encoded characters:
returnText=returnText.replace(/ /gi," ");
returnText=returnText.replace(/&/gi,"&");
returnText=returnText.replace(/"/gi,'"');
returnText=returnText.replace(/</gi,'<');
returnText=returnText.replace(/>/gi,'>');
//-- return
document.getElementById("output").value = returnText;
}
它与此HTML一起使用:
<textarea id="input" style="width: 400px; height: 300px;"></textarea><br />
<button onclick="convertHtmlToText()">CONVERT</button><br />
<textarea id="output" style="width: 400px; height: 300px;"></textarea><br />
答案 9 :(得分:8)
var text = html.replace(/<\/?("[^"]*"|'[^']*'|[^>])*(>|$)/g, "");
这是一个正则表达式版本,对格式错误的HTML更具弹性,例如:
未关闭的标签
Some text <img
“ <”,“>”标记属性内
Some text <img alt="x > y">
换行符
Some <a
href="http://google.com">
代码
var html = '<br>This <img alt="a>b" \r\n src="a_b.gif" />is > \nmy<>< > <a>"text"</a'
var text = html.replace(/<\/?("[^"]*"|'[^']*'|[^>])*(>|$)/g, "");
答案 10 :(得分:7)
与nickf或Shog9相比,另一个不太优雅的解决方案是从&lt; body&gt;开始以递归方式遍历DOM。标记并附加每个文本节点。
var bodyContent = document.getElementsByTagName('body')[0];
var result = appendTextNodes(bodyContent);
function appendTextNodes(element) {
var text = '';
// Loop through the childNodes of the passed in element
for (var i = 0, len = element.childNodes.length; i < len; i++) {
// Get a reference to the current child
var node = element.childNodes[i];
// Append the node's value if it's a text node
if (node.nodeType == 3) {
text += node.nodeValue;
}
// Recurse through the node's children, if there are any
if (node.childNodes.length > 0) {
appendTextNodes(node);
}
}
// Return the final result
return text;
}
答案 11 :(得分:6)
如果你想保留内容的链接和结构(h1,h2等),你应该看看TextVersionJS你可以将它用于任何HTML,虽然它是为了转换HTML电子邮件而创建的纯文本。
用法非常简单。例如,在node.js中:
var createTextVersion = require("textversionjs");
var yourHtml = "<h1>Your HTML</h1><ul><li>goes</li><li>here.</li></ul>";
var textVersion = createTextVersion(yourHtml);
或者在浏览器中使用纯js:
<script src="textversion.js"></script>
<script>
var yourHtml = "<h1>Your HTML</h1><ul><li>goes</li><li>here.</li></ul>";
var textVersion = createTextVersion(yourHtml);
</script>
它也适用于require.js:
define(["textversionjs"], function(createTextVersion) {
var yourHtml = "<h1>Your HTML</h1><ul><li>goes</li><li>here.</li></ul>";
var textVersion = createTextVersion(yourHtml);
});
答案 12 :(得分:4)
很多人已经回答了这个问题,但我认为分享我编写的从字符串中删除HTML标记但允许你包含一些你不想删除的标记的函数可能会有用。它很短,一直很适合我。
function removeTags(string, array){
return array ? string.split("<").filter(function(val){ return f(array, val); }).map(function(val){ return f(array, val); }).join("") : string.split("<").map(function(d){ return d.split(">").pop(); }).join("");
function f(array, value){
return array.map(function(d){ return value.includes(d + ">"); }).indexOf(true) != -1 ? "<" + value : value.split(">")[1];
}
}
var x = "<span><i>Hello</i> <b>world</b>!</span>";
console.log(removeTags(x)); // Hello world!
console.log(removeTags(x, ["span", "i"])); // <span><i>Hello</i> world!</span>
答案 13 :(得分:4)
来自CSS技巧:
https://css-tricks.com/snippets/javascript/strip-html-tags-in-javascript/
const originalString = `
<div>
<p>Hey that's <span>somthing</span></p>
</div>
`;
const strippedString = originalString.replace(/(<([^>]+)>)/gi, "");
console.log(strippedString);
答案 14 :(得分:4)
要获得更简单的解决方案,请尝试执行此=> https://css-tricks.com/snippets/javascript/strip-html-tags-in-javascript/
var StrippedString = OriginalString.replace(/(<([^>]+)>)/ig,"");
答案 15 :(得分:4)
在尝试了所提到的所有答案后,如果不是所有答案都有边缘情况,并且无法完全支持我的需求。
我开始探索php是如何做到的,并且遇到了php.js lib,它在这里复制了strip_tags方法:http://phpjs.org/functions/strip_tags/
答案 16 :(得分:4)
br
帐户&gt;内部属性和新创建的dom元素中的%for.end
。
用法:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
switch (keyData & Keys.KeyCode)
{
case Keys.Enter:
case Keys.Tab:
this.dataGridView.Focus();
break;
}
return base.ProcessCmdKey(ref msg, keyData);
}
演示:
做可怕事情的最佳答案演示:答案 17 :(得分:3)
我认为最简单的方法就是像上面提到的那样使用正则表达式。虽然没有理由使用它们。尝试:
stringWithHTML = stringWithHTML.replace(/<\/?[a-z][a-z0-9]*[^<>]*>/ig, "");
答案 18 :(得分:3)
这是一个解决@ MikeSamuel安全问题的版本:
function strip(html)
{
try {
var doc = document.implementation.createDocument('http://www.w3.org/1999/xhtml', 'html', null);
doc.documentElement.innerHTML = html;
return doc.documentElement.textContent||doc.documentElement.innerText;
} catch(e) {
return "";
}
}
注意,如果HTML标记不是有效的XML,它将返回一个空字符串(也就是说,必须关闭标记并且必须引用属性)。这并不理想,但确实避免了具有安全漏洞利用的问题。
如果没有有效的XML标记是您的要求,您可以尝试使用:
var doc = document.implementation.createHTMLDocument("");
但由于其他原因,这不是一个完美的解决方案。
答案 19 :(得分:3)
我对原始的Jibber 2000脚本做了一些修改 希望它对某人有用
str = '**ANY HTML CONTENT HERE**';
str=str.replace(/<\s*br\/*>/gi, "\n");
str=str.replace(/<\s*a.*href="(.*?)".*>(.*?)<\/a>/gi, " $2 (Link->$1) ");
str=str.replace(/<\s*\/*.+?>/ig, "\n");
str=str.replace(/ {2,}/gi, " ");
str=str.replace(/\n+\s*/gi, "\n\n");
答案 20 :(得分:2)
也可以使用精彩的htmlparser2纯JS HTML解析器。这是一个有效的演示:
var htmlparser = require('htmlparser2');
var body = '<p><div>This is </div>a <span>simple </span> <img src="test"></img>example.</p>';
var result = [];
var parser = new htmlparser.Parser({
ontext: function(text){
result.push(text);
}
}, {decodeEntities: true});
parser.write(body);
parser.end();
result.join('');
输出将为This is a simple example.
在此处查看此行动:https://tonicdev.com/jfahrenkrug/extract-text-from-html
如果您使用webpack这样的工具打包Web应用程序,这在节点和浏览器中都有效。
答案 21 :(得分:2)
我只需删除<a>
代码并将其替换为链接文字。
这似乎很有效。
htmlContent= htmlContent.replace(/<a.*href="(.*?)">/g, '');
htmlContent= htmlContent.replace(/<\/a>/g, '');
答案 22 :(得分:2)
您可以使用iframe sandbox attribute安全地删除html标记。
这里的想法是,我们不是尝试使用正则表达式,而是通过将文本注入DOM元素然后查询textContent
/ {{1}来利用浏览器的本机解析器。该元素的属性。
注入文本的最合适的元素是沙盒iframe,这样我们就可以阻止任意代码执行(也称为XSS)。
这种方法的缺点是它只适用于浏览器。
这是我提出的(未经过实战测试):
innerText
用法(demo):
const stripHtmlTags = (() => {
const sandbox = document.createElement("iframe");
sandbox.sandbox = "allow-same-origin"; // <--- This is the key
sandbox.style.setProperty("display", "none", "important");
// Inject the sanbox in the current document
document.body.appendChild(sandbox);
// Get the sandbox's context
const sanboxContext = sandbox.contentWindow.document;
return (untrustedString) => {
if (typeof untrustedString !== "string") return "";
// Write the untrusted string in the iframe's body
sanboxContext.open();
sanboxContext.write(untrustedString);
sanboxContext.close();
// Get the string without html
return sanboxContext.body.textContent || sanboxContext.body.innerText || "";
};
})();
答案 23 :(得分:2)
使用jQuery,您只需使用
即可检索它$('#elementID').text()
答案 24 :(得分:1)
接受的答案大多数都可以正常使用,但是如果html
字符串为null
,则会在IE中获得"null"
(而不是&#39;&#39;)。修正:
function strip(html)
{
if (html == null) return "";
var tmp = document.createElement("DIV");
tmp.innerHTML = html;
return tmp.textContent || tmp.innerText || "";
}
答案 25 :(得分:1)
input
元素support only one line text:
文本状态表示元素值的单行纯文本编辑控件。
function stripHtml(str) {
var tmp = document.createElement('input');
tmp.value = str;
return tmp.value;
}
更新:这可以按预期工作
function stripHtml(str) {
// Remove some tags
str = str.replace(/<[^>]+>/gim, '');
// Remove BB code
str = str.replace(/\[(\w+)[^\]]*](.*?)\[\/\1]/g, '$2 ');
// Remove html and line breaks
const div = document.createElement('div');
div.innerHTML = str;
const input = document.createElement('input');
input.value = div.textContent || div.innerText || '';
return input.value;
}
答案 26 :(得分:1)
使用Jquery:
function stripTags() {
return $('<p></p>').html(textToEscape).text()
}
答案 27 :(得分:1)
简单的2行jquery来剥离html。
var content = "<p>checking the html source </p><p>
</p><p>with </p><p>all</p><p>the html </p><p>content</p>";
var text = $(content).text();//It gets you the plain text
console.log(text);//check the data in your console
cj("#text_area_id").val(text);//set your content to text area using text_area_id
答案 28 :(得分:1)
我自己创建了一个正常的正则表达式:
str=str.replace(/(<\?[a-z]*(\s[^>]*)?\?(>|$)|<!\[[a-z]*\[|\]\]>|<!DOCTYPE[^>]*?(>|$)|<!--[\s\S]*?(-->|$)|<[a-z?!\/]([a-z0-9_:.])*(\s[^>]*)?(>|$))/gi, '');
答案 29 :(得分:0)
对于转义字符,这也可以使用模式匹配:
myString.replace(/((<)|(<)(?:.|\n)*?(>)|(>))/gm, '');
答案 30 :(得分:0)
https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML
var div = document.getElementsByTagName('div');
for (var i=0; i<div.length; i++) {
div[i].insertAdjacentHTML('afterend', div[i].innerHTML);
document.body.removeChild(div[i]);
}
答案 31 :(得分:0)
使用jQuery剥离html的一种更安全的方法是,首先使用jQuery.parseHTML创建DOM,忽略任何脚本,然后再让jQuery构建元素,然后仅检索文本。
function stripHtml(unsafe) {
return $($.parseHTML(unsafe)).text();
}
可以安全地从以下位置剥离HTML:
<img src="unknown.gif" onerror="console.log('running injections');">
和其他攻击。
nJoy!
答案 32 :(得分:0)
方法1:
function cleanHTML(str){
str.replace(/<(?<=<)(.*?)(?=>)>/g, '<$1>');
}
function uncleanHTML(str){
str.replace(/<(?<=<)(.*?)(?=>)>/g, '<$1>');
}
方法2:
function cleanHTML(str){
str.replace(/</g, '<').replace(/>/g, '>');
}
function uncleanHTML(str){
str.replace(/</g, '<').replace(/>/g, '>');
}
也请不要忘记用户是否碰巧发布了数学注释(ex: 1 < 2)
,而您也不想删除整个注释。浏览器(仅经过测试的Chrome)无法将unicode作为html标签运行。如果将字符串中的所有<
替换为<
每种软件,则Unicode将以文本形式显示<
,而无需运行任何html。我推荐方法2。jquery也很好用$('#element').text();
答案 33 :(得分:0)
(function($){
$.html2text = function(html) {
if($('#scratch_pad').length === 0) {
$('<div id="lh_scratch"></div>').appendTo('body');
}
return $('#scratch_pad').html(html).text();
};
})(jQuery);
将其定义为jquery插件,并按如下方式使用它:
$.html2text(htmlContent);
答案 34 :(得分:0)
var STR='<Your HTML STRING>''
var HTMLParsedText="";
var resultSet = STR.split('>')
var resultSetLength =resultSet.length
var counter=0
while(resultSetLength>0)
{
if(resultSet[counter].indexOf('<')>0)
{
var value = resultSet[counter];
value=value.substring(0, resultSet[counter].indexOf('<'))
if (resultSet[counter].indexOf('&')>=0 && resultSet[counter].indexOf(';')>=0) {
value=value.replace(value.substring(resultSet[counter].indexOf('&'), resultSet[counter].indexOf(';')+1),'')
}
}
if (value)
{
value = value.trim();
if(HTMLParsedText === "")
{
HTMLParsedText = value;
}
else
{
if (value) {
HTMLParsedText = HTMLParsedText + "\n" + value;
}
}
value='';
}
counter= counter+1;
resultSetLength=resultSetLength-1;
}
console.log(HTMLParsedText);
答案 35 :(得分:0)
如果您不想为此创建 DOM(可能您不在浏览器上下文中),您可以使用 striptags npm 包。
m_buf
答案 36 :(得分:0)
这个包非常适合剥离 HTML:https://www.npmjs.com/package/string-strip-html
它适用于浏览器和服务器(例如 Node.js)。
答案 37 :(得分:-1)
function strip_html_tags(str)
{
if ((str===null) || (str===''))
return false;
else
str = str.toString();
return str.replace(/<[^>]*>/g, '');
}
答案 38 :(得分:-2)
就我而言,$(".someClass").prop("innerText")
就足够了。