从电子邮件的字符串主体中删除格式标签

Chr*_*eta 3 html javascript tags google-apps-script

调用时如何删除所有格式标签:

GmailApp.getInboxThreads()[0].getMessages()[0].getBody()
Run Code Online (Sandbox Code Playgroud)

这样,文本的唯一剩余部分就是可以读取的内容.

格式化可以被破坏; 正文中的文本只需要解析,但标签如下:

"&" 
<br>
Run Code Online (Sandbox Code Playgroud)

可能需要删除.

Cor*_*y G 12

即使Apps Script中没有DOM,您也可以解析HTML并以这种方式获取纯文本:

function getTextFromHtml(html) {
  return getTextFromNode(Xml.parse(html, true).getElement());
}

function getTextFromNode(x) {
  switch(x.toString()) {
    case 'XmlText': return x.toXmlString();
    case 'XmlElement': return x.getNodes().map(getTextFromNode).join('');
    default: return '';
  }
}
Run Code Online (Sandbox Code Playgroud)

调用

getTextFromHtml("hello <div>foo</div>&amp; world <br /><div>bar</div>!");
Run Code Online (Sandbox Code Playgroud)

将返回

"你好foo&world bar!".

为了解释,将第二个参数作为"true"的Xml.parse将文档解析为HTML页面.然后我们遍历文档(将使用缺少的HTML和BODY元素等修补并转换为有效的XHTML页面),将文本节点转换为文本并展开所有其他节点.

这无疑是记录不清的; 我通过玩Xml对象并记录中间结果来写这个,直到我开始工作.我们需要更好地记录Xml的东西.


Ale*_*tri 6

我注意到您正在撰写Google Apps脚本.Google Apps脚本中没有DOM,您也无法创建元素并获取innerText属性.

getBody()为您提供HTML中的电子邮件正文.您可以使用以下代码替换标签:

var html = GmailApp.getInboxThreads()[0].getMessages()[0].getBody();
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\/?>/ig, '\n');
html=html.replace(/<[^>]+>/ig, '');
Run Code Online (Sandbox Code Playgroud)

也许你可以找到更多标签来替换.请记住,此代码不适用于任何HTML,但适用于getBody()HTML.GMail有自己的格式化方法,并没有在HTML中使用每个可能的现有标签,只使用它的一部分; 那么我们的GMail特定代码更短.


Jul*_* D. 0

我不确定你的意思.getBody()- 这是否应该返回 DOM 主体元素?

然而,删除 HTML 标签的最简单的解决方案可能是让浏览器渲染 HTML 并向他询问文本内容:

var myHTMLContent = "hello &amp; world <br />!";
var tempDiv = document.createElement('div');
tempDiv.innerHTML = myHTMLContent;

// retrieve the cleaned content:
var textContent = tempDiv.innerText;
Run Code Online (Sandbox Code Playgroud)

对于上面的示例,textContent变量将包含文本

"hello & world
!"
Run Code Online (Sandbox Code Playgroud)

(请注意由于标签而导致的换行<br />。)