使用正则表达式从HTML页面中获取所有链接

3
我正在使用Google Apps Script从Gmail中获取电子邮件的内容,然后我需要从HTML标签中提取所有链接。我在stackoverflow上找到了一些代码,并使用正则表达式实现了它,但问题是它总是返回给我第一个URL。(http://vacante2016.eu/tr/17599/51743713/c4f5eadf38eb475d39e3cdeca9201538
有没有办法制作一个循环来搜索下一个与正则表达式匹配的内容,以逐个显示所有元素?
这里您可以看到一个示例,其中包含我需要从中获取这些链接的电子邮件的内容:https://www.mailinator.com/inbox2.jsp?public_to=get_urls#/#public_showmaildiv 这是我的代码:
function getURL() {

  var threads = GmailApp.getInboxThreads();
  var message = threads[0].getMessages()[0];
  var content = message.getRawContent();

    var source = (content || '').toString();
    var urlArray = [];
    var url;
    var matchArray;

    // Regular expression to find FTP, HTTP(S) URLs.
    var regexToken = /(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/;

    // Iterate through any URLs in the text.
    while( (matchArray = regexToken.exec( source )) !== null )
    {
      var token = matchArray[0];
      urlArray.push( token );
    }
}

更新: 将正则表达式更改为/(?:ht|f)tps?\:\/\/[a-zA-Z0-9\-.]+\.[a-zA-Z]{2,3}(\/[\S=]*)?/g可以改善问题,但是当我搜索URL时,我也会得到以下类型的响应:"http://vacante2016.eu/clk/17599/5=\r\n1743713/150132/bf7639dd7e7aa48c9197a52a8c61e168\"><img"... 我认为正则表达式还应该有一个条件来返回url,但仅限于>符号。 此外,是否有一种方法可以从找到的URL中删除额外的字符,例如=\r\n

1
看起来你忘了 /gvar regexToken = /(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/g;。请参阅 https://dev59.com/onRB5IYBdhLWcg3wxZ1K。 - Wiktor Stribiżew
如果电子邮件使用HTML格式,那么为什么不直接从标签中获取属性呢? - NTL
@WiktorStribiżew已经解决了这个问题,但现在一个URL响应看起来像这样:http://vacante2016.eu/tr/17599/51743713/c4f5eadf38eb475d39e3cde=ca9201538将在等号后被截断,如下所示:http://vacante2016.eu/tr/17599/51743713/c4f5eadf38eb475d39e3cde...为什么会发生这种情况? - Valip
仍然是一样的,这就是fetch返回url的方式:href=3D"http://vacante2016.eu/tr/17599/51743713/c4f5eadf38eb475d39e3cde=ca9201538,上面的正则表达式将url截断为http://vacante2016.eu/tr/17599/51743713/c4f5eadf38eb475d39e3cde - Valip
@WiktorStribiżew非常感谢您的帮助,我已经更新了我的问题。 - Valip
显示剩余4条评论
2个回答

3

要使用全局修饰符/g才能使用RegExp#exec获取多个匹配。

另外,由于你的输入是HTML代码,你需要确保不要使用\S抓取<

/(?:ht|f)tps?:\/\/[-a-zA-Z0-9.]+\.[a-zA-Z]{2,3}(\/[^"<]*)?/g

请查看正则表达式演示

如果由于某种原因,该模式无法匹配等号,请将其作为备选项添加:

/(?:ht|f)tps?:\/\/[-a-zA-Z0-9.]+\.[a-zA-Z]{2,3}(?:\/(?:[^"<=]|=)*)?/g

查看另一个演示(不过,第一个演示应该就可以了)。


它们是字符串字面量,我使用 token.replace(/\\[rn]|=/g, '') 但没有任何反应。为了确保,我在使用 replace 前也执行了 toke.toString()。 - Valip
这部分有效是因为只删除了 = 。我还尝试过使用 .replace("\r", "") ,但是没有效果... - Valip
如果你的JavaScript代码中有换行符、回车符或等号,上述解决方案必须能够正常工作。当孩子们睡觉时,我会在Google Apps Script中进行双重检查。 - Wiktor Stribiżew
最终通过 .replace(/(=\r\n|\n|\r)/gm, '') 解决了问题。 - Valip
好的,那就完成了。我认为你可以将它缩短为.replace(/=\r\n|\n|\r/g, '') - Wiktor Stribiżew
显示剩余3条评论

-2

根据您提供的代码,我假设您能够将电子邮件内容作为HTML字符串获取。

function getHref(content){
  var el = document.createElement('html');
  el.innerHTML = content;

  var hrefs = [];

  var elements = el.getElementsByTagName('a');

  for (var i=0; i < elements.length; i++){
    hrefs.push(elements[i].href);
  }

  return hrefs;
}

这将返回页面上所有锚点标签的href属性数组。


3
在Google Apps Scripts中无法访问document对象。该框架不支持所有的JS功能,仅支持部分功能。 - Wiktor Stribiżew
这仅适用于浏览器端,客户端。Google应用脚本是服务器端的,那里根本没有DOM。 - roma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接