Perché FILTER_VALIDATE_URL restituisce FALSE solo per questo URL?

Ho il codice seguente:

<?php $pictureurl="http://icons3.iconfinder.netdna-cdn.com/data/icons/pool/poolbird.png"; if(filter_var($pictureurl, FILTER_VALIDATE_URL) === FALSE){ echo "Invalid Url"; exit; }else{ echo "Works!"; } ?> 

Questo display "url non valido" (FALSE) per l'url sopra, ma non per altri URL più semplici. è un insetto? puoi persino accedere all'image.

E il più importnte è qual è la soluzione per questo?

Grazie

PHP <5.2.13 contiene un bug in FILTER_VALIDATE_URL che considera gli URL contenenti il ​​'-' ( http://bugs.php.net/51192 ). O hai bisogno di aggiornare la tua copia di php o utilizzare un meccanismo di filtraggio diverso.

Quel codice printing "Funziona!" per me. Quale versione di PHP stai usando? Puoi pubblicare un link a una pagina PHP contenente:

<?php phpinfo(); ?>

Inoltre, vedi questa domanda .

Eseguendo PHP 5.2.13, ottengo questa risposta quando provo a filtrare un URL valido:

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

Questo chiaramente non è quello che mi aspettavo che tornasse. Il dominio è valido

Questo è stato evidentemente risolto e sarà incluso in PHP 5.3.3 e 5.2.14, maggiori informazioni in questo bugreport: http://bugs.php.net/bug.php?id=51192

L'archivio sorgente da http://www.php.net/get/php-5.3.2.tar.bz2/from/a/mirror contiene una strana versione di ext / filter / logical_filter.c, una versione che non posso trova nei cvs . Questa versione esegue un test "extra" sulla parte host dell'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++; } 

che non consente un trattino nel nome host come in icons3.iconfinder.netdna cdn.com
Molto strano e molto sbagliato.