Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Подскажите функцию для проверки на локальный URL


Автор: artnik 17.9.2011, 09:24
В google ничего подобного не нашел. Попробовал написать сам, но получилось совсем не надежно, т.к. в рег. выражениях я новичек.
Код

function isLocalURL(URL) {
    var isLocalURL = false,
        isLocalPath = ! URL.match(/^http:\/\//) && ! URL.match(/^https:\/\//); // Проверка на локальный путь типа "/test.html" или "test.php?s=something"
    
    if (isLocalPath) return true;                                              // Если это локальный путь
    else {
        var realLocalUrl = window.location.protocol+'//'+window.location.host;
        if (URL.length < realLocalUrl) return false;                           // Если длина URL меньше чем реальная длина URL сайта
        var expr = new RegExp('^'+realLocalUrl);
        isLocalURL = URL.match(expr)?true:false;                               // Проверка на локальный URL
    }
    return isLocalPath || isLocalURL;                                          // Если это локальный путь или локальный урл возвращаем true, иначе false
}

тут нехватает проверки на www., ssl и еще кучи всего. но вреде работает кроссбраузерно (тестил в ie6).

Может у кого-нить есть готовый скрипт? Либо подскажите как доработать этот.

Заранее спасибо!

Автор: artnik 17.9.2011, 09:41
Еще немного погуглив нашел нечто подобное, но тоже не ловит www. и ssl.
Код

function isLocalURL(url) {
    var match = url.match(/^([^:\/?#]+:)?(?:\/\/([^\/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/);
    if (typeof match[1] === "string" && match[1].length > 0 && match[1].toLowerCase() !== location.protocol) return false;
    if (typeof match[2] === "string" && match[2].length > 0 && match[2].replace(new RegExp(":("+{"http:":80,"https:":443}[location.protocol]+")?$"), "") !== location.host) return false;
    return true;
}

Может кто знает как научить его определять www. и ssl.?

Добавлено через 2 минуты и 55 секунд
Вот, кстати описание того, как этот regex работает http://tools.ietf.org/html/rfc3986#appendix-B

Автор: InfMag 17.9.2011, 15:42
Я как раз подобное на накануне писал:
Код

var getPathNameOfCurrentHost = function (url) {
    url = url.toString();
    var hostname = location.hostname.toString().replace(/www\./ig, '');
    
    if (url.indexOf(hostname) > -1) {
        url = url.replace(/^.+\:\/\/[^\/]+/i, '');
    }
    
    return (url != '') ? url : '/';
};

Возвращает либо всё, что после http://site.com, либо полный url если ссылка не местная. Но можно ведь без проблем переделать под вашу задачу:
Код

var testUrlForLocal = function (url) {
    url = url.toString();
    var hostname = location.hostname.toString().replace(/www\./ig, '');
    
    if (url.indexOf(hostname) > -1) {
        return true;
    }
    
    return false;
};

Автор: InfMag 17.9.2011, 21:39
Хотя прошу прощения, если url не будет содержать http:// а чисто pathname, что будет у ссылок в браузерах, то функция вернёт false, вот маленький фикс:
Код

var testUrlForLocal = function (url) {
    url = url.toString();
    var hostname = location.hostname.toString().replace(/www\./ig, '');
    
    if (!(/^.+\:\/\/[^\/]+/i.test(url)) || url.indexOf(hostname) > -1) {
        return true;
    }
    
    return false;
};

Автор: artnik 18.9.2011, 08:39
Спасибо InfMag что отвечаешь.
testUrlForLocal работает, но немного не доделанная. Если к примеру адрес сайта http://localhost и в функцию посылать этот адрес, то она возвращает true (все верно), но и если адрес сайта будет к примеру http://localhost.ru то тоже возвратит true.
Поэтому я решил смешать ваш скрипт с тем что я нагуглил и получилось очень даже хорошо.
Код

function isLocalURL(url) {
    var url = url.replace(/www\./ig, ''),
        match = url.match(/^([^:\/?#]+:)?(?:\/\/([^\/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/);
    if (typeof match[1] === "string" && match[1].length > 0 && match[1].toLowerCase() !== location.protocol) return false;
    if (typeof match[2] === "string" && match[2].length > 0 && match[2].replace(new RegExp(":("+{"http:":80,"https:":443}[location.protocol]+")?$"), "") !== location.host) return false;
    return true;
}

Добавил url.replace(/www\./ig, '') и теперь все ровно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)