Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите функцию для проверки на локальный URL 
:(
    Опции темы
artnik
Дата 17.9.2011, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 10.9.2011

Репутация: нет
Всего: нет



В 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:50
PM MAIL   Вверх
artnik
Дата 17.9.2011, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 10.9.2011

Репутация: нет
Всего: нет



Еще немного погуглив нашел нечто подобное, но тоже не ловит 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
PM MAIL   Вверх
InfMag
Дата 17.9.2011, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 2
Всего: 4



Я как раз подобное на накануне писал:
Код

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;
};

PM   Вверх
InfMag
Дата 17.9.2011, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 2
Всего: 4



Хотя прошу прощения, если 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;
};

PM   Вверх
artnik
Дата 18.9.2011, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 10.9.2011

Репутация: нет
Всего: нет



Спасибо 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, '') и теперь все ровно.

Это сообщение отредактировал(а) artnik - 18.9.2011, 08:40
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0437 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.