Проверка реферера

Я использую это, чтобы проверить, пришел ли кто-то из Reddit, однако это не работает.

var ref = document.referrer;
if(ref.match("/http://(www.)?reddit.com(/)?(.*)?/gi"){
    alert('You came from Reddit');
} else {
    alert('No you didn\'t');
}

Предложения по регулярному выражению также приветствуются.


person Ben Shelock    schedule 08.01.2010    source источник


Ответы (6)


Попробуй это:

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
person gnarf    schedule 08.01.2010
comment
+1 за подробное объяснение регулярного выражения. Очень полезно. - person Tim Mackey; 29.06.2012

Закройте if родительскую скобку...

person Skilldrick    schedule 08.01.2010
comment
:) Все делают такие ошибки. Используйте что-то, что выдаст вам ошибки (например, Firebug), потому что смотреть на страницу с молчаливым сбоем JavaScript — это PITA. - person Skilldrick; 09.01.2010

Я использовал альтернативу RegEx, ища домен в реферере

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

РЕДАКТИРОВАТЬ: Как указывает thekingoftruth, это не работает, если reddit.com включен в параметр URL, поэтому я немного расширил его. Я также добавил toLowerCase(), как я заметил в RegExp выше.

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');
    }
}
person TimSmith-Aardwolf    schedule 13.06.2014
comment
Единственная проблема заключается в том, что реферер содержит вложенный URL-адрес в качестве параметра запроса, скажем. - person thekingoftruth; 15.07.2015
comment
Справедливое замечание. Я полагаю, я мог бы сделать чек на ? и посмотри перед этим. Я также добавил toLowerCase(). Мне просто немного грустно (если не удивлено), что однострочного решения больше нет :-) - person TimSmith-Aardwolf; 03.02.2017
comment
Я слышу тебя. Javascript действительно затрудняет создание компактных однострочников. :( - person thekingoftruth; 08.02.2017

Попробуй это:

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

Or:

ref.match(/^http:\/\/(www\.)?reddit\.com\//i)
person Gumbo    schedule 08.01.2010

Я бы использовал это, не будет ли это меньшим и простым способом?

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

Используйте var ref = document.referer; // ОДИН R вместо ДВУХ

person Community    schedule 15.03.2014
comment
Это точно соответствует тому, что я искал; ссылка в шапке. - person cjbarth; 06.08.2015