В аналогичной ситуации мне это сошло с рук:
someUtils.validateURL = function(url) {
var parser = document.createElement('a');
try {
parser.href = url;
return !!parser.hostname;
} catch (e) {
return false;
}
};
т.е. зачем изобретать колесо, если браузер может сделать это за вас? Но, конечно, это будет работать только в браузере.
Существуют различные части анализируемого URL, как именно его интерпретирует браузер:
parser.protocol; // => "http:"
parser.hostname; // => "example.com"
parser.port; // => "8080"
parser.pathname; // => "/path/"
parser.search; // => "?search=test"
parser.hash; // => "#hash"
parser.host; // => "example.com:3000"
Используя их, вы можете улучшить свою функцию проверки в зависимости от требований. Единственным недостатком является то, что он будет принимать относительные URL и использовать хост и порт текущей страницы сервера. Но вы можете использовать его в своих интересах, собирая URL-адрес из частей и всегда передавая его полностью в службу AJAX.
То, что validateURL
не примет, является недействительным URL, например http:\:8883
вернет false, но :1234
является действительным и интерпретируется как http://pagehost.example.com/:1234
, то есть как относительный путь.
UPDATE
Этот подход больше не работает с Chrome и другими браузерами WebKit. Даже если URL-адрес недействителен, имя хоста заполняется некоторым значением, например, взято из base
. Он по-прежнему помогает анализировать части URL, но не позволяет их проверить.
Возможный лучший подход без собственного анализатора - использовать var parsedURL = new URL(url)
и перехватывать исключения. Смотрите, например URL API . Поддерживается всеми основными браузерами и NodeJS, хотя все еще помечен как экспериментальный.