检查引荐来源

35
我正在使用这个方法来检查是否有人来自Reddit,然而它没有起作用。
var ref = document.referrer;
if(ref.match("/http://(www.)?reddit.com(/)?(.*)?/gi"){
    alert('You came from Reddit');
} else {
    alert('No you didn\'t');
}

欢迎提供有关正则表达式的建议。

6个回答

110

试试这个:

if (ref.match(/^https?:\/\/([^\/]+\.)?reddit\.com(\/|$)/i)) {
  alert("Came from reddit");
}

正则表达式:

/^           # ensure start of string
 http        # match 'http'
 s?          # 's' if it exists is okay
 :\/\/       # match '://'
 ([^\/]+\.)? # match any non '/' chars followed by a '.' (if they exist)
 reddit\.com # match 'reddit.com'
 (\/|$)      # match '/' or the end of the string
/i           # match case-insenitive

25
感谢深入解释正则表达式,非常有帮助。+1 - Tim Mackey

14

关闭你的if条件语句括号


3
每个人都会犯这样的错误。使用一些会产生错误的工具(比如Firebug),因为盯着一个默默失败的JavaScript页面真的很让人恼火。 - Skilldrick

7

我一直在使用一种替代正则表达式的方法,即通过查找引荐网站的域名来实现。

if (document.referrer.indexOf('reddit.com') >= 0) { alert('They came from Reddit.com'); }

编辑:由于thekingoftruth指出如果reddit.com包含在URL参数中,则无法使用该方法,因此我进行了扩展。我还添加了toLowerCase(),因为我在上面的正则表达式中注意到了它。
if (document.referrer.indexOf('?') > 0){
    if (document.referrer.substring(0,document.referrer.indexOf('?')).toLowerCase().indexOf('reddit.com') >= 0){
    alert('They came from Reddit');
    }
} else {
    if (document.referrer.toLowerCase().indexOf('reddit.com') > 0){
            alert('They came from Reddit');
    }
}

2
唯一的问题是如果引荐者包含一个子URL作为查询参数。 - thekingoftruth
1
公正的观点,thekingoftruth。我想我可以检查是否有“?”并在其前面查找。我还添加了一个 toLowerCase()。我只是有点难过(如果不是惊讶)这个一行解决方案不再存在 :-) - TimSmith-Aardwolf
我听到你了。Javascript 真的很难让代码变得简洁。:( - thekingoftruth

2

试试这个:

ref.match(new RegExp("^http://(www\\.)?reddit\\.com/", "i"))

或者:

ref.match(/^http:\/\/(www\.)?reddit\.com\//i)

1

我会使用这个,不这样做会是一个更简单的方式吗?

  var referral= document.refferer;
   If(referral.includes("www.reddit.com"){
  alert("you came from reddit");
   }
     else{
    alert("you didn't come from reddit");
       {

-4

使用 var ref = document.referrer; // 一个 R 而不是两个


这正好符合我所寻找的内容;头部中的引用者。 - cjbarth

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