我正在使用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
等其他字符?
答案 0 :(得分:1)
您需要使用全局修饰符/g
与RegExp#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属性的数组。