【问题标题】:Is there a function or example for converting html string to plaintext without html tags using Google Apps Script?是否有使用 Google Apps 脚本将 html 字符串转换为没有 html 标签的纯文本的功能或示例?
【发布时间】:2019-07-19 17:35:55
【问题描述】:

在 JavaScript 中,这个解决方案可以完成这项工作:

function strip(html)
{
   var tmp = document.createElement("DIV");
   tmp.innerHTML = html;
   return tmp.textContent || tmp.innerText || "";
}

但据我所知,Google Apps 脚本中没有文档。是否有另一种方法可以在 Google Apps 脚本中解析和显示来自 html 的纯文本?

我尝试过使用

HtmlService.createHtmlOutput('<b>Hello, world!</b>').getContent();

但是这只是显示带有所有标签的文本。

我的期望是

的输入
'<b>Hello, world!</b>'

会输出

'Hello, world!'

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    可以通过两种不同的方式删除 html 标签:

    1. Reg Exp - 正则表达式
    2. 将 HTML 转换为 XML 并使用 XmlService 获取每个元素,然后获取每个元素的值

    Reg Exp 更好,因为您不需要查找每个 HTML 元素,这需要更多代码。

    必须首先将 HTML 转换为 XML,以便使用 XmlService.getPrettyFormat()。如果首先使用正则表达式删除 html 标记,那么代码将不知道应该在哪里换行。

    使用XmlService.getPrettyFormat() 将用换行符格式化html。但要使用 XmlService,必须先将 html 字符串转换为 XML。在将 html 字符串转换为 XML 时,您需要做几件事以避免错误。

    function parseHtml() {
    
      var html = 'This is just a Test<br><br>Here is my List<br>\
        <ol><li>one</li><li>Two</li><li>Three</li></ol><br>And a bulleted one<br><ul>\
        <li>Bullet One</li><li>Bullet Two</li><li>Bullet Three</li></ul>'; 
    
      html = '<div>' + html + '</div>';//To avoid the "Content is not allowed in prolog." error
      html = html.replace(/<br>/g,"");//To avoid an error when parsing to xml
      //Logger.log('html: ' + html)
    
      var document = XmlService.parse(html);
    
      var output = XmlService.getPrettyFormat().format(document);
      //Logger.log(output);
    
      output = output.replace(/<[^>]*>/g,"");
      Logger.log(output)
    }
    

    另一种方法(仅作为学习示例提供)是使用XmlService 将 HTML 解析为 Xml,然后循环遍历所有元素。 以下代码仅通过几层子级。

    function parseHtml() {
    
      var html = 'This is just a Test<br><br>Here is my List<br>\
        <ol><li>one</li><li>Two</li><li>Three</li></ol><br>And a bulleted one<br><ul>\
        <li>Bullet One</li><li>Bullet Two</li><li>Bullet Three</li></ul>'; 
    
      html = '<div>' + html + '</div>';
      html = html.replace(/<br>/g,"");
      //Logger.log('html: ' + html)
    
      var allText = "";
      var thisTxt;
    
      var document = XmlService.parse(html);
      var root = document.getRootElement();
      //Logger.log('root: ' + JSON.stringify(root))
    
      var content = root.getAllContent();
      //Logger.log('content: ' + JSON.stringify(content))
    
      var L = content.length;
    
      for (var i=0;i<L;i++) {
        var thisEl = content[i];
        if (!thisEl) {continue;}
    
        var theType = thisEl.getType();
        //Logger.log('theType: ' + theType)
        //Logger.log('typeof theType: ' + typeof theType)
    
        if (theType === theType.ELEMENT) {
          var asElmt = thisEl.asElement();
          var allChildren = asElmt.getChildren();
    
          if (allChildren) {
            var nmbrOfChildren = allChildren.length;
            //Logger.log('nmbrOfChildren: ' + nmbrOfChildren)
          }
    
          if (!nmbrOfChildren) {
            thisTxt = asElmt.getValue();
    
            //Logger.log('thisTxt 43: ' + thisTxt)
            allText = allText + thisTxt  + "\n";
            continue;
          }
    
          for (var j=0;j<nmbrOfChildren;j++) {
    
            thisTxt = allChildren[j].getValue();
            if (!thisTxt) {
              continue;
            }
    
            allText = allText + thisTxt + "\n";
    
          }
          continue;
        }
    
        //Logger.log(thisEl.getValue())   
        allText = allText + thisEl.getValue()  + "\n";
    
      }
    
      //Logger.log('allText: ' + allText + "\n")
    
    }
    

    【讨论】:

    • 我得到“序言中不允许内容。”当我尝试使用包含有序列表的 html 时。 function ParseHtml() { var html = '这只是一个测试

      这是我的列表
      1. 一个
      2. 两个
      3. 三个

      还有一个项目符号
      • 项目符号一
      • 项目符号二
      • 项目符号三
      '; var document = XmlService.parse(html);//创建一个 XML 文档 var root = document.getRootElement();//获取文档根元素节点 var text = root.getText();//获取文档的文本值元素节点 Logger.log('text:' + text) }
    • “序言中不允许内容”。错误是因为内容的第一部分:“这只是一个测试”没有包含在开始和结束标记中。您还必须替换所有 &lt;br&gt; 标记,因为它们没有结束标记:html = "&lt;div&gt;" + html + "&lt;/div&gt;"; html = html.replace(/&lt;br&gt;/g,"");Logger.log("html:" + html) 您还需要做更多事情,但这只是一个开始。您可能希望使用添加的测试代码更新您的原始问题。
    • XmlService.getPrettyFormat() 可能更容易。
    • 我刚刚尝试了var output = XmlService.getPrettyFormat().format(document);Logger.log(output);,但它没有删除 HTML 标签,这是问题所要求的。但是,这是清理缩进和格式化换行符的好方法。有没有更好的去除html标签的方法?
    • 我明白了。我一开始没有测试。经过测试,我认为我们可以使用正则表达式:Logger.log(output.replace(/&lt;[^&gt;]*&gt;/g,"")); after format
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 2021-12-24
    • 2020-05-26
    • 1970-01-01
    • 2012-03-09
    • 2014-04-21
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多