Возникла проблема в проверке 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);
}
Может кто владеет знанием о корректном способе проверки?
Я пользуюсь вот этой регуляркой: «((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)», она вполне адекватна, хотя не претендует на истину в последней инстанции…
А для каких целей выполняется проверка?
Цели – что бы было. Уже надоело писать для каждой задачи новый валидатор, гораздо удобнее иметь 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);
}
Да, эта регекспа проходится именно по требованиям IANA, или кого там….
фильтр работает не просто на PHP 5, а на PHP >= 5.2
nalim, если быть точным, то функции filter_var кроме PHP >= 5.2 нужно включение модуля filter.so
Кстати видел недавно оффициальную регулярку для проверки e-mail, соответствующую всем спецификациям. Больше тысячи символов =)