我应该使用哪种RegEx?

时间:2016-01-04 17:08:44

标签: javascript regex google-apps-script

我正在使用Google Apps脚本。我正在尝试使用RegEx获取从网页提取的HTML内容中的内容并保存为字符串。我想获取以下格式的数据,

<font color="#FF0101">
        Data which is want to fetch
</font>

我应该使用哪个RegEx来获取<font>标记中包含的数据(开始和结束标记)。请注意颜色属性,因为我只想从那些具有代码中给出的颜色属性和值的标签中获取数据

3 个答案:

答案 0 :(得分:2)

您可以使用Google Apps脚本XmlService来解释结构良好的HTML文本,而无需使用RegEx来解析HTML。

function myFunction() {
  var xml = '<font color="#FF0101">Data which is want to fetch</font>';
  var doc = XmlService.parse(xml);
  var content = doc.getContent(0).getValue();
  Logger.log( content );  // "Data which is want to fetch"
  var color = doc.getContent(0).asElement().getAttribute('color').getValue();
  Logger.log( color );    // "#FF0101"
}

答案 1 :(得分:1)

如果JS完全受支持,您可以使用基于DOM的解决方案。

var html = "<font color=\"#FF0202\">NOT THIS ONE</font><font color=\"#FF0101\">\n        Data which is want to fetch\n</font>";
var faketag = document.createElement('faketag');
faketag.innerHTML = html;
var arr = [];
[].forEach.call(faketag.getElementsByTagName("font"), function(v,i,a) {
    if (v.hasAttributes() == true) {
      for (var o = 0; o < v.attributes.length; o++) {
        var attrib = v.attributes[o];
        if (attrib.name === "color" && attrib.value === "#FF0101")     				{
    		   arr.push(v.innerText.replace(/^\s+|\s+$/g, ""));
        }
      }
    }
});
document.body.innerHTML = JSON.stringify(arr);

然而,acc。到GAS reference

  

但是,由于Apps脚本代码在Google的服务器上运行(不是客户端,HTML-service pages除外),因此无法使用基于浏览器的功能(如DOM操作或Window API)。

您可以尝试使用正则表达式获取<font color="#FF0101">标记的内部文本:

function myFunction() {
  var doc = DocumentApp.getActiveDocument();
  var paras = doc.getParagraphs();
  var MyRegex = new RegExp('<font\\b[^<]*\\s+color="#FF0101"[^<]*>([\\s\\S]*?)</font>','ig');
  for (i=0; i<paras.length; ++i) {
    while (match = MyRegex.exec(paras[i].getText()))
    {
      Logger.log(match[1]); 
    }
  }
}

针对<font color="#FF0202">NOT THIS ONE</font><font color="#FF0101"> Data which is want to fetch</font>的结果:

enter image description here

正则表达式匹配任何font标记,其中color属性的值为#FF0101在双引号内。 请注意,解析HTML时regexp不可靠!这个任务的更好的正则表达式是

<font\\b[^<]*\\s+color="#FF0101"[^<]*>([^<]*(?:<(?!/font>)[^<]*)*)</font>

如果您的HTML数据跨越多个段落,请使用

function myFunction() {
  var doc = DocumentApp.getActiveDocument();
  var text = doc.getBody().getText();
  var MyRegex = new RegExp('<font\\b[^<]*\\s+color="#FF0101"[^<]*>([\\s\\S]*?)</font>','ig');
  while (match = MyRegex.exec(text))
  {
     Logger.log(match[1]); 
  }
}

使用此输入:

<font color="#FF0202">NOT THIS ONE</font>
<font color="#FF0101">
         Data which is want to fetch
</font>

结果是:

enter image description here

答案 2 :(得分:0)

您正在使用JavaScript,因此您没有理由尝试使用正则表达式解析HTML。

var div = document.createElement('div');
div.innerHTML = "your HTML here";

var match = div.querySelectorAll("font[color='#FF0101']");
// loop through `match` and get stuff
// e.g. match[0].textContent.replace(/^\s+|\s+$/g,'')