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

Тема в разделе "Как сделать...", создана пользователем sartiii, 25 янв 2009.

Статус темы:
Закрыта.
  1. sartiii

    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.
     
  2. bobov1

    bobov1 Постоялец

    Регистр.:
    5 авг 2007
    Сообщения:
    91
    Симпатии:
    4
    Вот несколько способов

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

     
    sartiii нравится это.
  3. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Использовать CURL для валидации - это жесть.
    К тому же в PHP используется параметр CURLOPT_TIMEOUT, а не CURLOPT_CONNECTTIMEOUT. Да и таймаут в 1 секунду - не серьёзно.

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

    sartiii Постоялец

    Регистр.:
    17 сен 2008
    Сообщения:
    105
    Симпатии:
    17
    bobov1
    1ый вариант не пропустил http://www.nulled.ws/showthread.php?t=99255

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


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

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