document.body.innerHTML中的javascript HTML

document.body.innerHTML中的javascript HTML,javascript,regex,parsing,Javascript,Regex,Parsing,我试图构建一个网页的内容字符串,而不使用HTML语法(可能会用空格代替它,这样单词就不会连在一起)或标点符号 假设你有代码: <body> <h1>Content:</h1> <p>paragraph 1</p> <p>paragraph 2</p> <script> alert("blah blah blah"); </script>

我试图构建一个网页的内容字符串,而不使用HTML语法(可能会用空格代替它,这样单词就不会连在一起)或标点符号

假设你有代码:

    <body>
    <h1>Content:</h1>
    <p>paragraph 1</p>
    <p>paragraph 2</p>

    <script> alert("blah blah blah"); </script>

    This is some text<br />
    ....and some more
    </body>

你知道怎么做吗?谢谢。

您可以使用
innerText
属性(而不是
innerHTML
,后者也会返回HTML标记):


但是,请注意,这也将包括新行,因此如果您完全按照问题中指定的内容,则需要删除它们。

您需要一个用于删除新行的正则表达式,以及一个用单个空格替换连续新行的正则表达式。

某些浏览器支持W3C DOM 3 Core textContent属性,或者其他浏览器支持的MS/HTML5 innerText属性(有些浏览器同时支持这两种属性)。脚本元素的内容可能是不需要的,因此递归遍历DOM树的相关部分似乎是最好的:

// Get the text within an element
// Doesn't do any normalising, returns a string
// of text as found.
function getTextRecursive(element) {
  var text = [];
  var self = arguments.callee;
  var el, els = element.childNodes;

  for (var i=0, iLen=els.length; i<iLen; i++) {
    el = els[i];

    // May need to add other node types here
    // Exclude script element content
    if (el.nodeType == 1 && el.tagName && el.tagName.toLowerCase() != 'script') {
      text.push(self(el));

    // If working with XML, add nodeType 4 to get text from CDATA nodes
    } else if (el.nodeType == 3) {

      // Deal with extra whitespace and returns in text here.
      text.push(el.data);
    }
  }
  return text.join('');
}
//获取元素中的文本
//不执行任何规格化,返回字符串
//找到的文本的数量。
函数getTextRecursive(元素){
var text=[];
var self=arguments.callee;
var el,els=element.childNodes;

对于(var i=0,iLen=els.length;i您可以尝试使用下面的replace语句

var str = "..your HTML..";
var content = str.replace(/</?[a-zA-Z0-9]+>|<[a-zA-Z0-9]+\s*/>|\r?\n/g," ");

若要消除空白,请执行以下操作:
var content=document.getElementsByTagName(“body”)[0].innerText.replace(/\s*/g,”)
唯一的问题是Firefox不支持innerText。你不需要正则表达式来解决这个问题,简单的拆分->加入将更有效地完成这项工作。@patrick dw-我忘记了一个非常好的观点。
textContent
属性可以解决这个问题。@Stove-你的正则表达式看起来会在e和e之间添加一个空格非常有个性…@James:是的,我用
(document.body.textContent | | document.body.innerText)开始了一个解决方案。替换(…
),但是
textContent
似乎也给了你
的内容。在那之后失去了兴趣。:o)-1每个人都太匆忙而不去使用正则表达式(计算代价太高)有了更高效的解决方案。只起作用的东西并不总是最好的。如果你知道用一个空格替换连续的空格和换行符的更有效的方法,我相信OP会很感激你提供它。我不知道,我能投票给一个没有JSFIDLE的答案吗?;o)对于那些感兴趣的人。我添加的唯一内容是:
.replace(/\s+/g',)
以提供所需的输出操作。我还需要注意的是,
参数。被调用方
已弃用,目前在“严格模式”下不可用+1@patrick-arguments.callee在ES5中未被弃用(其中弃用表示在将来的版本中标记为删除),但它的使用受到限制,因为它在严格模式下不可用。我的理解是,今天的“严格模式”将在下一版本的ECMAScript中成为标准。这不正确吗?我不知道。ES5严格模式代码可能不会在ES 3环境中无错误地运行,反之亦然。我认为,如果不先进行长时间的弃用并明确声明,删除ES 5中限制的ES 3功能实际上是不可能的。我我还没有看到这方面的证据。是的,我可能错了。我本以为我是在Harmony的Wiki上读到的,但现在我找不到了。我能找到的最接近的东西是“未来的ECMAScript版本可能会引入新语法,ECMAScript 5中的严格模式会应用一些限制来简化转换…”建议未来版本中至少有一些功能需要强制执行严格的模式规则,但肯定不建议完全反对严格的模式冲突。
// Get the text within an element
// Doesn't do any normalising, returns a string
// of text as found.
function getTextRecursive(element) {
  var text = [];
  var self = arguments.callee;
  var el, els = element.childNodes;

  for (var i=0, iLen=els.length; i<iLen; i++) {
    el = els[i];

    // May need to add other node types here
    // Exclude script element content
    if (el.nodeType == 1 && el.tagName && el.tagName.toLowerCase() != 'script') {
      text.push(self(el));

    // If working with XML, add nodeType 4 to get text from CDATA nodes
    } else if (el.nodeType == 3) {

      // Deal with extra whitespace and returns in text here.
      text.push(el.data);
    }
  }
  return text.join('');
}
var str = "..your HTML..";
var content = str.replace(/</?[a-zA-Z0-9]+>|<[a-zA-Z0-9]+\s*/>|\r?\n/g," ");
   Content:   paragraph 1   paragraph 2    alert("blah blah blah");   This is some text  ....and some more