Почему FILTER_VALIDATE_URL возвращает FALSE только для этого URL-адреса?

У меня есть следующий код:

<?php $pictureurl="http://img.ruphp.com/php/poolbird.png"; if(filter_var($pictureurl, FILTER_VALIDATE_URL) === FALSE){ echo "Invalid Url"; exit; }else{ echo "Works!"; } ?> 

Это отображение «неверный URL» (FALSE) для вышеуказанного URL-адреса, но не для других простых URL-адресов. Это ошибка? вы даже можете получить доступ к изображению.

И самое главное, для чего это решение?

благодаря

PHP <5.2.13 содержит ошибку в FILTER_VALIDATE_URL которая рассматривает URL-адреса, содержащие '-' ( http://bugs.php.net/51192 ). Вам либо нужно обновить свою копию php, либо использовать другой механизм фильтрации.

Этот код печатает «Works!». для меня. Какую версию PHP вы используете? Можете ли вы опубликовать ссылку на страницу PHP, содержащую:

<?php phpinfo(); ?>

Также см. Этот вопрос .

Запуск PHP 5.2.13, я получаю этот ответ при попытке фильтровать действительный URL-адрес:

 php > var_dump(filter_var("http://www.asdf-asdf.com", FILTER_VALIDATE_URL)); bool(false) 

Это явно не то, что я ожидал, что он вернется. Домен действителен.

Это, очевидно, теперь исправлено и будет включено в PHP 5.3.3 и 5.2.14, больше информации в этом сообщении: http://bugs.php.net/bug.php?id=51192

Исходный архив из http://www.php.net/get/php-5.3.2.tar.bz2/from/a/mirror содержит странную версию ext / filter / logical_filter.c, версию я не могу найти в cvs . Эта версия выполняет «дополнительный» тест на главной части URL-адреса

 e = url->host + strlen(url->host); s = url->host; while (s < e) { if (!isalnum((int)*(unsigned char *)s) && *s != '_' && *s != '.') { goto bad_url; } s++; } 

который не позволяет дефис в имени хоста, как в icons3.iconfinder.netdna cdn.com
Очень странно и очень неправильно.