【问题标题】:Remove formatting tags from string body of email从电子邮件的字符串正文中删除格式标记
【发布时间】:2012-01-20 02:29:16
【问题描述】:

调用时如何去掉所有格式化标签:

GmailApp.getInboxThreads()[0].getMessages()[0].getBody()

使得文本的唯一剩余部分是可以阅读的。

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

"&" 
<br>

可能还有其他人,需要删除。

【问题讨论】:

    标签: javascript html tags google-apps-script


    【解决方案1】:

    即使 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 '';
      }
    }
    

    打电话

    getTextFromHtml("hello <div>foo</div>&amp; world <br /><div>bar</div>!");
    

    将返回

    “你好 foo& 世界酒吧!”。

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

    诚然,这没有很好的记录;我通过玩弄 Xml 对象并记录中间结果来写这个,直到我让它工作。我们需要更好地记录 Xml 内容。

    【讨论】:

      【解决方案2】:

      我注意到您正在编写 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, '');
      

      也许你可以找到更多的标签来替换。请记住,此代码不是针对任何 HTML,而是针对 getBody() HTML。 GMail 有自己的方式来格式化 de body,并且不会使用 HTML 中所有可能存在的标签,只使用它的一个子集;那么我们的 GMail 特定代码会更短。

      【讨论】:

      • 这对我来说非常有效,我还添加了html=html.replace(/&lt;\/p&gt;\s*&lt;p&gt;/ig, '&lt;/p&gt;&lt;p&gt;'); 这可能是我特有的,但我在两个 p 标签之间有很多空格,所以这把它们去掉了!
      【解决方案3】:

      我找到了一种更简单的方法来完成这项任务。

      sendEmail() 的参数中使用 htmlBody 高级参数。举个例子:

      var threads = GmailApp.search ('is:unread'); //searches for unread messages   
      var messages = GmailApp.getMessagesForThreads(threads); //gets messages in 2D array
      
      for (i = 0; i < messages.length; ++i)
      {
      j = messages[i].length; //to process most recent conversation in thread (contains messages from previous conversations as well, reduces redundancy
      messageBody = messages[i][j-1].getBody(); //gets body of message in HTML
      messageSubject = messages [i][j-1].getSubject();
      GmailApp.sendEmail("dummyuser@dummysite.com", messageSubject, "", {htmlBody: messageBody});
      }
      

      首先我找到所有包含未读消息的线程。然后,我使用 GmailApp 中的 getMessagesForThreads() 方法将线程中包含的消息放入一个二维数组。然后我创建了一个为我找到的所有线程运行的 for 循环。我将 j 设置为线程消息计数,因此我只能发送线程 (j-1) 上的最新消息。我通过 getBody() 获得消息的 HTML 正文,通过 getSubject() 获得主题。我使用 sendEmail(recipients, subject, body, optAdvancedArgs) 发送电子邮件并处理 HTML 正文。结果是发送的电子邮件格式正确,包含 HTML 的所有功能。这些方法的文档可以在这里找到:https://developers.google.com/apps-script/service_gmail

      我希望这会有所帮助,手动解析方法也确实有效,但我仍然发现 HTML 的零碎残留,所以我想我会尝试一下,它对我有用,如果我在longrun 我会更新这篇文章。到现在为止还挺好!

      【讨论】:

        【解决方案4】:

        Google 现在拥有getPlainBody() 函数,可以从电子邮件正文中获取纯文本。它在文本类中。

        我一直在使用脚本发送电子邮件以将其转换为任务,而谷歌通过更改上述 Corey 答案的功能来打破它。我已将其替换为以下内容。

        var taskNote = ((thread.getMessages()[0]).getPlainBody()).substring(0,1000);
        

        【讨论】:

          【解决方案5】:

          我不确定您所说的 .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;
          

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

          "hello & world
          !"
          

          (注意&lt;br /&gt;标签导致的换行符。)

          【讨论】:

          • 搜索 indexOf() 时还会找到“
            ”吗?
          • 不,但你会发现一个换行符 (\n)。
          猜你喜欢
          • 1970-01-01
          • 2020-01-12
          • 1970-01-01
          • 2020-06-04
          • 1970-01-01
          • 1970-01-01
          • 2014-05-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多