我有一个CouchDB视图映射函数,用于生成存储的HTML文档的摘要(文本的第一个x
个字符)。不幸的是,我没有将HTML转换为纯文本的浏览器环境。
目前我使用这个多阶段正则表达式
html.replace(/<style([\s\S]*?)<\/style>/gi, ' ')
.replace(/<script([\s\S]*?)<\/script>/gi, ' ')
.replace(/(<(?:.|\n)*?>)/gm, ' ')
.replace(/\s+/gm, ' ');
虽然它是一个非常好的过滤器,但它显然不是一个完美的过滤器,而且有些残留物有时会漏掉。有没有更好的方法在没有浏览器环境的情况下转换为纯文本?
答案 0 :(得分:9)
这个正则表达式有效:
text.replace(/<[^>]*>/g, '');
答案 1 :(得分:6)
使用TextVersionJS(http://textversionjs.com),您可以将HTML转换为纯文本。它是纯粹的javascript(有大量的RegExps),所以你可以在浏览器和node.js中使用它。
在node.js中,它看起来像:
var createTextVersion = require("textversionjs");
var yourHtml = "<h1>Your HTML</h1><ul><li>goes</li><li>here.</li></ul>";
var textVersion = createTextVersion(yourHtml);
(我从页面复制了这个例子,你必须先npm安装模块。)
答案 2 :(得分:5)
将HTML转换为纯文本,例如Gmail:
html = html.replace(/<style([\s\S]*?)<\/style>/gi, '');
html = html.replace(/<script([\s\S]*?)<\/script>/gi, '');
html = html.replace(/<\/div>/ig, '\n');
html = html.replace(/<\/li>/ig, '\n');
html = html.replace(/<li>/ig, ' * ');
html = html.replace(/<\/ul>/ig, '\n');
html = html.replace(/<\/p>/ig, '\n');
html = html.replace(/<br\s*[\/]?>/gi, "\n");
html = html.replace(/<[^>]+>/ig, '');
如果您可以使用jQuery
:
var html = jQuery('<div>').html(html).text();
答案 3 :(得分:1)
您可以尝试这种方式。 textContent
innerText
var temp = document.createElement("div");
temp.innerHTML = html;
return temp.textContent || temp.innerText || "";
它们都不兼容所有浏览器:
catch(Exception e) {
return e;
}
答案 4 :(得分:0)
将@EpokK的HTML答案更新为电子邮件文本版本用例
const htmltoText = (html: string) => {
let text = html;
text = text.replace(/\n/gi, "");
text = text.replace(/<style([\s\S]*?)<\/style>/gi, "");
text = text.replace(/<script([\s\S]*?)<\/script>/gi, "");
text = text.replace(/<a.*?href="(.*?)[\?\"].*?>(.*?)<\/a.*?>/gi, " $2 $1 ");
text = text.replace(/<\/div>/gi, "\n\n");
text = text.replace(/<\/li>/gi, "\n");
text = text.replace(/<li.*?>/gi, " * ");
text = text.replace(/<\/ul>/gi, "\n\n");
text = text.replace(/<\/p>/gi, "\n\n");
text = text.replace(/<br\s*[\/]?>/gi, "\n");
text = text.replace(/<[^>]+>/gi, "");
text = text.replace(/^\s*/gim, "");
text = text.replace(/ ,/gi, ",");
text = text.replace(/ +/gi, " ");
text = text.replace(/\n+/gi, "\n\n");
return text;
};
答案 5 :(得分:0)
如果你想要一些准确的东西并且可以使用 npm 包,我会使用 html-to-text。
来自自述文件:
const { htmlToText } = require('html-to-text');
const html = '<h1>Hello World</h1>';
const text = htmlToText(html, {
wordwrap: 130
});
console.log(text); // Hello World
仅供参考,我在 npm 趋势中发现了这个; html-to-text 似乎是我的用例的最佳选择,但您可以查看其他 here。
答案 6 :(得分:-2)
非常简单,你也可以实现一个&#34; toText&#34;原型:
String.prototype.toText = function(){
return $(html).text();
};
//Let's test it out!
var html = "<a href=\"http://www.google.com\">link</a> <br /><b>TEXT</b>";
var text = html.toText();
console.log("Text: " + text); //Result will be "link TEXT"