在Javascript中从文本中剥离标记,并在textarea中用换行符替换BR

在Javascript中从文本中剥离标记,并在textarea中用换行符替换BR,javascript,jquery,regex,Javascript,Jquery,Regex,我需要在输入textarea值中导入一些格式化的html文本 我使用jquery 那么最好的方法是什么呢? 我想首先我需要替换,然后去掉其余部分(粗体、斜体、图像等)$(“#我的文本区域”)。更改(函数(){ var cleanText=$(“”).html(this.value); this.value=cleanText.text(); }); 示例:在我的第一个回答中,我没有看到您想要保留换行符,因此这里有一个更好的版本。它用一个不太可能的字符串%%br%%替换br,然后在末尾用新行(\

我需要在输入textarea值中导入一些格式化的html文本

我使用jquery

那么最好的方法是什么呢? 我想首先我需要替换
,然后去掉其余部分(粗体、斜体、图像等)

$(“#我的文本区域”)。更改(函数(){
var cleanText=$(“”).html(this.value);
this.value=cleanText.text();
});

示例:

在我的第一个回答中,我没有看到您想要保留换行符,因此这里有一个更好的版本。它用一个不太可能的字符串%%br%%替换br,然后在末尾用新行(\n)替换它们。因此,如果该字符串实际出现在文本中,它将被替换为新行。你可以把它改成你喜欢的任何东西,只是让它成为文本中不太可能遇到的东西

<script>

function removeMarkup(m) {
  var d = document.createElement('div');
  d.innerHTML = m;
  var c = 0;

  // Make brString something that should never appear in the text
  // and has no special meaning in a RegExp
  var brString = '%%br%%'
  var re = new RegExp('\\s*' + brString + '\\s*','g');

  function getTextWithReturns(node) {

    var tag = node.tagName && node.tagName.toLowerCase();
    var nodes = node.childNodes;
    var type = node.nodeType;
    var s = '';

    // Deal with br
    if (tag == 'br') {
      return brString;
    }

    if (nodes && nodes.length) {
      for (var i=0, iLen=nodes.length; i<iLen; i++) {
        s += getTextWithReturns(nodes[i]);
      }
    } else if (type == 3 || type == 4) {
      s += node.nodeValue
    } 
    return s;
  }
  return reduceWhitespace(getTextWithReturns(d)).replace(re,'\n');
}

function reduceWhitespace(s) {
  return s.replace(/^\s*/,'').replace(/\s*$/,'').replace(/\s+/g,' ');
}

</script>

<div id="d0">some text <i>more</i> text
  <p>Here is a paragraph with some <b>bold</b> and <i>italic</i> text, plus a <span>span</span> and a line break break break<br> about there.</p>
  <p>Here is another paragraph with some <b>bold</b> and <i>italic</i> text, plus plus a <span>span</span> and a line break <br> here.</p>
</div>

<form>
<textarea id="ta0" rows="10" cols="50"></textarea>
<button type="button" onclick="
  var ta = document.getElementById('ta0');
  var div = document.getElementById('d0');
  ta.value = removeMarkup(div.innerHTML);
">Set value</button><input type="reset">
</form>

函数removeMarkup(m){
var d=document.createElement('div');
d、 innerHTML=m;
var c=0;
//使brString成为不应出现在文本中的内容
//并且在RegExp中没有特殊意义
var brString='%br%%'
var re=new RegExp('\\s*'+brString+'\\s*','g');
函数getTextWithReturns(节点){
var tag=node.tagName&&node.tagName.toLowerCase();
var nodes=node.childNodes;
var type=node.nodeType;
var s='';
//处理br
如果(标记=='br'){
返回brString;
}
if(nodes&&nodes.length){

for(var i=0,iLen=nodes.length;iinnerText是Microsoft的专有属性,并非所有浏览器都支持它等效的W3C DOM属性是textContent。但是,空格和换行符的处理方式不同,应该使用某种正则表达式或替换将其正常化。哪一种处理换行符的方式不同?
textContent
innerText
?我的编辑是否解决了跨浏览器问题?它们各不相同顺便说一句,jQuery两者都不使用,它在子节点上递归查找文本节点并连接它们的值。这是一种合理的策略,但通常比在可用的情况下使用textContent或innerText慢。
<script>

function removeMarkup(m) {
  var d = document.createElement('div');
  d.innerHTML = m;
  var c = 0;

  // Make brString something that should never appear in the text
  // and has no special meaning in a RegExp
  var brString = '%%br%%'
  var re = new RegExp('\\s*' + brString + '\\s*','g');

  function getTextWithReturns(node) {

    var tag = node.tagName && node.tagName.toLowerCase();
    var nodes = node.childNodes;
    var type = node.nodeType;
    var s = '';

    // Deal with br
    if (tag == 'br') {
      return brString;
    }

    if (nodes && nodes.length) {
      for (var i=0, iLen=nodes.length; i<iLen; i++) {
        s += getTextWithReturns(nodes[i]);
      }
    } else if (type == 3 || type == 4) {
      s += node.nodeValue
    } 
    return s;
  }
  return reduceWhitespace(getTextWithReturns(d)).replace(re,'\n');
}

function reduceWhitespace(s) {
  return s.replace(/^\s*/,'').replace(/\s*$/,'').replace(/\s+/g,' ');
}

</script>

<div id="d0">some text <i>more</i> text
  <p>Here is a paragraph with some <b>bold</b> and <i>italic</i> text, plus a <span>span</span> and a line break break break<br> about there.</p>
  <p>Here is another paragraph with some <b>bold</b> and <i>italic</i> text, plus plus a <span>span</span> and a line break <br> here.</p>
</div>

<form>
<textarea id="ta0" rows="10" cols="50"></textarea>
<button type="button" onclick="
  var ta = document.getElementById('ta0');
  var div = document.getElementById('d0');
  ta.value = removeMarkup(div.innerHTML);
">Set value</button><input type="reset">
</form>