Полная валидация URL

Статус
В этой теме нельзя размещать новые ответы.

sartiii

Постоялец
Регистрация
17 Сен 2008
Сообщения
105
Реакции
17
Интересуют способы проверки ссылок на правильность. Нужно проверить не только хост и домен, но и имена файлов, параметры и прочие хвосты.

Нашёл такие варианты, но у каждого свой недостаток:

Работает начиная с PHP5
Код:
function isvalid_url_php5($url) {
	return filter_var($url, FILTER_VALIDATE_URL);
}

Требует CURL, иногда может долго висеть, игнорируя ограничения на таймаут
Код:
function curlcheckurl($url) {
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1);
	$url_contents = curl_exec($ch);
	curl_close($ch);
		if ($url_contents != FALSE) {
			return true;
			echo $url_contents;
		} else {
			return false;
		}
}

Написано, что сделано в соответствии со стандартом формата URI, но возвращает true на любую строку
Код:
function isValidURI($url) {
	//--> Complies with RFC2396
	return preg_match('~^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?~', $url);
}

Интересуют другие методы проверки url.
 
Вот несколько способов

1)Исправленный вариант функции с перл рег.експрешонами:
PHP:
function validateURL($url)  
{  
$pattern = '/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/';  
return preg_match($pattern, $url);  
}  

//протестим:
$result = validateURL('http://www.google.com');  
print $result;
2) тоже самое но со стандартными средствами РНР:
PHP:
function validateURL($url)  
{  
$pattern = "^(https?|ftp)\:\/\/([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)*(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?\$";

return eregi($pattern, $url);  
}
 
Использовать CURL для валидации - это жесть.
К тому же в PHP используется параметр CURLOPT_TIMEOUT, а не CURLOPT_CONNECTTIMEOUT. Да и таймаут в 1 секунду - не серьёзно.

Да и как ты собираешься валидировать имена файлов, если они могут быть какими угодно (с пробелами, знаками препинания, различноязычными и т.п.)? В смысле к чему проверка того что может иметь практически любое значение.
 
bobov1
1ый вариант не пропустил Для просмотра ссылки Войди или Зарегистрируйся

2ой справился со всеми тестовыми урлами, я доволен. спасибо.


PHP_Master
Использовать сокеты для валидации - ужаст. А CURL - ещё более менее =)
Но зато можно точно знать что сслыка доступна, проверить тип документа и много других узкоспецифичных вещей.
Непонятно почему автор функции использовал CURLOPT_CONNECTTIMEOUT а не CURLOPT_TIMEOUT. Я сразу внимания и не обратил.
А никто и не утверждал что 1 секунда - окончательный вариант ;)

Проверка соответствия url стандарту, в котором нет русских букв, пробелов и прочих спецсимволов и на который не будут ругаться браузеры.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху