从Text JavaScript中删除HTML

时间:2009-05-04 22:39:55

标签: javascript html string

有一种简单的方法可以在JavaScript中获取一串html并删除html吗?

39 个答案:

答案 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();

如果没有html

将返回一个空字符串

使用:

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

代替。

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

答案 5 :(得分:35)

转换HTML用于纯文本电子邮件,保持超链接(a href)完整

由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 &quot;normal text&quot; and stuff using &lt;html encoding&gt;                 
    </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(/&nbsp;/gi," ");
    returnText=returnText.replace(/&amp;/gi,"&");
    returnText=returnText.replace(/&quot;/gi,'"');
    returnText=returnText.replace(/&lt;/gi,'<');
    returnText=returnText.replace(/&gt;/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);

}

演示:

https://jsfiddle.net/gaby_de_wilde/pqayphzd/

做可怕事情的最佳答案演示:

https://jsfiddle.net/gaby_de_wilde/6f0jymL6/1/

答案 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&nbsp;</p><p>&nbsp;
  </p><p>with&nbsp;</p><p>all</p><p>the html&nbsp;</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(/((&lt)|(<)(?:.|\n)*?(&gt)|(>))/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, '&lt;$1&gt;');
}

function uncleanHTML(str){
  str.replace(/&lt;(?<=&lt;)(.*?)(?=&gt;)&gt;/g, '<$1>');
}

方法2:

function cleanHTML(str){
  str.replace(/</g, '&lt;').replace(/>/g, '&gt;');
}

function uncleanHTML(str){
  str.replace(/&lt;/g, '<').replace(/&gt;/g, '>');
}

也请不要忘记用户是否碰巧发布了数学注释(ex: 1 < 2),而您也不想删除整个注释。浏览器(仅经过测试的Chrome)无法将unicode作为html标签运行。如果将字符串中的所有<替换为&lt;每种软件,则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")就足够了。