我们有这个 speedbump 代码,可以向用户显示他们即将离开网站的通知(这是 ADA 的事情)。看起来它是在正则表达式中完成的,我现在被要求也支持 mailto:
链接。我在正则表达式方面最差,这已经让我感到困惑。有没有人有任何指示?
这是当前处理主机名评估的片段:
var re = new RegExp("^(http(s)?:)?\\/\\/([a-z0-9-_\\.]*\\.)?(" + whitelist.join("|").replace(/\./g, "\\.") + ")(\\/.*)?$", "i");
$('a').each(function() {
var hrefTest = $(this).attr('href');
if (hrefTest) {
if (!re.test(hrefTest) && (hrefTest.substring(0,4) == 'http')) {
$(this).addClass('speedbump-enabled');
}
}
});
基本上,如果用户点击的链接与当前主机名不匹配,我们会向他们显示一个弹出窗口,提醒他们他们即将离开网站。
白名单部分是一个单独的逻辑,允许在 speedbump 弹出窗口中忽略主机名的白名单(即,不显示的主机名)。
更新和可能的解决方案
我最终改变了:
if ( !re.test(hrefTest) && (hrefTest.substring(0,4) == 'http') ) {
...到...
if ( !re.test(hrefTest) && ( (hrefTest.substring(0,4) == 'http') || (hrefTest.substring(0,6) == 'mailto') ) ) {
这似乎已经解决了 mailto
链接的问题,但还不能 100% 确定。仍在测试以确认它是一个可行的解决方案。
最佳答案
我不确定 mailto 的官方定义:链接,但以下正则表达式匹配 Wikipedia 中提到的所有示例
mailto:(?:[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)?(?:,[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)*(?:[\?\&](?:(?:subject)|(?:body)|(?:b?cc)|(?:to))=[^\&\?\n]*)*
有关测试用例,请参阅 regex101
关于javascript - 外部链接的 Speedbump 也支持 mailto 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46776582/