danyim ответ точный, хотя он может не соответствовать вашим потребностям, как отмечено в комментариях. Кроме того, его решение было на основе php. После сканирования вашего участия в теге, я предполагаю, что вы на самом деле предпочли бы решение javascript (поэтому я предоставлю оба!).
Во-первых, рефакторинг своего php:
function isValidURL($url) {
$regex = "((https?|ftp)\:\/\/)?"; // SCHEME
$regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass
$regex .= "((([a-z][a-z0-9-.]*)\.([a-z]{2,3}))|(([12]?[0-9]?[0-9]\.){4}))"; // Host or IP
$regex .= "(\:[0-9]{2,5})?"; // Port
$regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path
$regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query
$regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor
return preg_match($regex, lcase($url));
}
Обратите внимание, что я изменил return для выполнения операции lcase перед проверкой URL. Вы также можете использовать регистрозависимый флаг в регулярном выражении, чтобы избежать необходимости в этом. Как уже отмечалось, есть несколько частей, которые могут или не могут быть действительными для ваших сценариев использования. В частности, у вас может никогда не возникнуть ситуация, когда вы хотите принять URL-адрес, содержащий имя пользователя / pw или исходящий из статического IP-адреса. Вы можете изменить регулярное выражение, чтобы исключить любые части соответствия, которые никогда не будут действительными, удалив соответствующую строку. Кроме того, вот вторая опция для линии //Host or IP
, чтобы сделать ее только хостом:
$regex .= "([a-z][a-z0-9-.]*)\.([a-z]{2,3})"; // Host only
А теперь то же самое в javascript (объединенном вместе, потому что js обрабатывает регулярные выражения, отличные от строк ... корректировки будут легче делать в версии php, а затем подражать здесь):
function isValidURL(url) {
var regex = /((https?|ftp)\:\/\/)?([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?((([a-z][a-z0-9-.]*)\.([a-z]{2,3}))|(([12]?[0-9]?[0-9]\.){4}))(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?/i
return (url.match(regex));
}