在保留换行符(使用JavaScript)的同时将HTML转换为纯文本最方便的方法是什么?

时间:2010-09-28 13:26:55

标签: javascript html plaintext

基本上我只需要从浏览器窗口复制HTML并将其粘贴到textarea元素中。

例如我想要这个:

<p>Some</p>
<div>text<br />Some</div>
<div>text</div>

成为这个:

Some
text
Some
text

5 个答案:

答案 0 :(得分:16)

如果HTML在您的网页中可见,您可以通过用户选择(或IE中的TextRange)来实现。这确实可以保留换行符,如果不一定是前导和尾随空格。

2012年12月10日更新

但是,toString()对象的Selection方法是not yet standardized并且浏览器之间的工作方式不一致,所以这种方法基于不稳定的基础而且我不建议使用它现在即可。如果不接受,我会删除这个答案。

演示:http://jsfiddle.net/wv49v/

代码:

function getInnerText(el) {
    var sel, range, innerText = "";
    if (typeof document.selection != "undefined" && typeof document.body.createTextRange != "undefined") {
        range = document.body.createTextRange();
        range.moveToElementText(el);
        innerText = range.text;
    } else if (typeof window.getSelection != "undefined" && typeof document.createRange != "undefined") {
        sel = window.getSelection();
        sel.selectAllChildren(el);
        innerText = "" + sel;
        sel.removeAllRanges();
    }
    return innerText;
}

答案 1 :(得分:4)

我试图找到一些我之前写过的代码。它工作得很好。让我概述一下它做了什么,希望你可以复制它的行为。

  • 用alt或标题文字替换图像。
  • 用“text [link]”
  • 替换链接
  • 替换通常会产生垂直空白区域的东西。 h1-h6,div,p,br,hr等(我知道,我知道。这些实际上可能是内联元素,但效果很好。)
  • 去掉剩下的标签,换上空字符串。

您甚至可以将其扩展为格式化有序和无序列表等内容。这实际上取决于你想走多远。

修改

找到代码!

public static string Convert(string template)
{
    template = Regex.Replace(template, "<img .*?alt=[\"']?([^\"']*)[\"']?.*?/?>", "$1"); /* Use image alt text. */
    template = Regex.Replace(template, "<a .*?href=[\"']?([^\"']*)[\"']?.*?>(.*)</a>", "$2 [$1]"); /* Convert links to something useful */
    template = Regex.Replace(template, "<(/p|/div|/h\\d|br)\\w?/?>", "\n"); /* Let's try to keep vertical whitespace intact. */
    template = Regex.Replace(template, "<[A-Za-z/][^<>]*>", ""); /* Remove the rest of the tags. */

    return template;
}

答案 2 :(得分:1)

我根据这个答案做了一个函数:https://stackoverflow.com/a/42254787/3626940

function htmlToText(html){
    //remove code brakes and tabs
    html = html.replace(/\n/g, "");
    html = html.replace(/\t/g, "");

    //keep html brakes and tabs
    html = html.replace(/<\/td>/g, "\t");
    html = html.replace(/<\/table>/g, "\n");
    html = html.replace(/<\/tr>/g, "\n");
    html = html.replace(/<\/p>/g, "\n");
    html = html.replace(/<\/div>/g, "\n");
    html = html.replace(/<\/h>/g, "\n");
    html = html.replace(/<br>/g, "\n"); html = html.replace(/<br( )*\/>/g, "\n");

    //parse html into text
    var dom = (new DOMParser()).parseFromString('<!doctype html><body>' + html, 'text/html');
    return dom.body.textContent;
}

答案 3 :(得分:0)

基于chrmcpn的答案,我必须将基本的HTML电子邮件模板转换为纯文本版本,作为node.js中构建脚本的一部分。我必须使用JSDOM才能使其正常工作,但这是我的代码:

const htmlToText = (html) => {
    html = html.replace(/\n/g, "");
    html = html.replace(/\t/g, "");

    html = html.replace(/<\/p>/g, "\n\n");
    html = html.replace(/<\/h1>/g, "\n\n");
    html = html.replace(/<br>/g, "\n");
    html = html.replace(/<br( )*\/>/g, "\n");

    const dom = new JSDOM(html);
    let text = dom.window.document.body.textContent;

    text = text.replace(/  /g, "");
    text = text.replace(/\n /g, "\n");
    text = text.trim();
    return text;
}

答案 4 :(得分:-1)

三个步骤。

First get the html as a string.
Second, replace all <BR /> and <BR> with \r\n.
Third, use the regular expression "<(.|\n)*?>" to replace all markup with "".