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

时间:2016-08-08 12:59:24

标签: javascript regex google-apps-script

我正在使用Google Apps脚本从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改进了所有内容,但现在我在搜索网址时也得到以下类型的响应:"http://vacante2016.eu/clk/17599/5=\r\n1743713/150132/bf7639dd7e7aa48c9197a52a8c61e168\"><img" ...我认为正则表达式也应该有条件返回{ {1}}但最多只有url符号。

另外,有没有办法从找到的网址中删除>=\r等其他字符?

2 个答案:

答案 0 :(得分:1)

您需要使用全局修饰符/gRegExp#exec进行多次匹配。

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

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

请参阅regex demo

如果由于某种原因,此模式与等号不匹配,请将其添加为替代:

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

请参阅another demo(但是,第一个应该这样做。)

答案 1 :(得分:-1)

我假设根据您提供的代码,您可以将电子邮件的内容作为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属性的数组。