Возникла проблема в проверке URL на правильность, или другими словами валидацию. Интернет кишит большим разнообразием подобных скриптов, но если им передать нетипичный url с множеством редких символов – они начинают неадекватно реагировать и большинство грамоздких ссылок валидацию не проходят. Это меня и опечалило.

Стал копать глубже, нашёл ещё несколько вариантов, но опять-таки с недостатками.

Работает только с PHP 5:

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);
curl_setopt($ch, CURLOPT_PROXY, ‘192.168.13.4:8080′);
$url_contents = curl_exec($ch);
curl_close($ch);
if ($url_contents != FALSE) {
return true;
echo $url_contents;
} else {
return false;
}
}

Написано, что сделан в соответствии со стандартом формата URI, но возвращает true на любую строку, даже близко не похожую на url:

function isValidURI($url) {
//–> Complies with RFC2396
return preg_match(‘~^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?~’, $url);
}

Может кто владеет знанием о корректном способе проверки?

Опубликовано 25.01.2009в 01:55. В рубриках: PHP. Вы можете следить за ответами к этой записи через RSS 2.0. Вы можете оставить свой отзыв или трекбек со своего сайта.

6 комментариев на «Корректная валидация URL»

  1. Реинкарнатор² on 25.01.2009 в 02:39

    Я пользуюсь вот этой регуляркой: «((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)», она вполне адекватна, хотя не претендует на истину в последней инстанции…

  2. seokot on 25.01.2009 в 20:21

    А для каких целей выполняется проверка?

  3. admin on 26.01.2009 в 00:04

    Цели – что бы было. Уже надоело писать для каждой задачи новый валидатор, гораздо удобнее иметь 1 универсальный. А вообще, для очередного скрипта, который выложу в ближайшие дни. В нём проверка url будет одной из важных задач.

    На форуме подсказали ещё один вариант. Со всеми тестовыми url справился отлично и вполне меня устроил:
    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);
    }

  4. Реинкарнатор² on 26.01.2009 в 00:49

    Да, эта регекспа проходится именно по требованиям IANA, или кого там….

  5. nalim on 30.09.2009 в 14:42

    фильтр работает не просто на PHP 5, а на PHP >= 5.2

  6. admin on 06.11.2009 в 10:13

    nalim, если быть точным, то функции filter_var кроме PHP >= 5.2 нужно включение модуля filter.so

    Кстати видел недавно оффициальную регулярку для проверки e-mail, соответствующую всем спецификациям. Больше тысячи символов =)

Оставьте отзыв

Это не спам.
сделано dimoning.ru