Eléphanteau du PHP |
11 Messages
17 juil. 2012, 22:30
Bon juste pour info pour ceux que ça intéresserait, le problème avec la regex que j'avais trouvé c'est simplement qu'il manquait les majuscules:
Code : Tout sélectionner
function isValidURL($url) {
$urlregex = "#^(https?|ftp)\:\/\/"; // SCHEME
$urlregex .= "([a-zA-Z0-9+!*(),;?&=\$_.-]+(\:[a-zA-Z0-9+!*(),;?&=\$_.-]+)?@)?"; // USER AND PASS (optional)
// HOSTNAME OR IP
$urlregex .= "[a-zA-Z0-9+\$_-]+(\.[a-zA-Z0-9+\$_-]+)*"; // http://x = allowed (ex. http://localhost, http://routerlogin)
//$urlregex .= "[a-zA-Z0-9+\$_-]+(\.[a-zA-Z0-9+\$_-]+)+"; // http://x.x = minimum
//$urlregex .= "([a-zA-Z0-9+\$_-]+\.)*[a-zA-Z0-9+\$_-]{2,3}"; // http://x.xx(x) = minimum
//use only one of the above
$urlregex .= "(\:[0-9]{2,5})?"; // PORT (optional)
$urlregex .= "(\/([a-zA-Z0-9+\$_-]\.?)+)*\/?"; // PATH (optional)
$urlregex .= "(\?[a-zA-Z+&\$_.-][a-zA-Z0-9;:@/&%=+\$_.-]*)?"; // GET Query (optional)
$urlregex .= "(\#[a-zA-Z_.-][a-zA-Z0-9+\$_.-]*)?\$#"; // ANCHOR (optional)
// test
if (preg_match($urlregex, $url)) {return true;} else {return false;}
}
Après a forcer de chercher j'ai trouvé pourquoi filter_var(validate_url) n'est pas fiable:
filter_var in PHP
In PHP 5 there is a function called filter_var which allows you to test a piece of data against a filter. One of the filters is FILTER_VALIDATE_URL and this seems like the obvious case to use. It's usage would be something like:
$result = filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED);
Simple, right? The issue is with how this works. FILTER_VALIDATE_URL attempts to pass the URL through parse_url and see if it can break the URL down. In the documentation of parse_url it says, "This function is not meant to validate the given URL".
Additionally, if you test this you'll find urls like "http://", http://... and many other invalid URLs will pass because they have a structure parse_url can handle.
Je suis pas très fort en anglais mais j'ai l'impression que ça veut dire que la fonction filter_validate_url c'est un peu du bricolage.
Ensuite je me suis renseigné sur les normes qui concerne les URLs et c'est compliqué mais il semble que la dernière soit la RFC 3986 et date de 2005
j'ai donc pu trouvé ensuite cette fonction qui valide les url par rapport a cette norme:
http://code.google.com/p/php-rfc-3986/
j'ai également besoin de valider dans mon formulaire donc j'ai trouvé cette fonction javascript pour cette meme norme:
https://github.com/garycourt/uri-js
je donne aussi au passage cette autre regex qui donne de très bon résultat:
https://gist.github.com/729294