[SPIP] +2.1.12
[velocampus/web/www.git] / www / plugins / auto / verifier / verifier / url.php
1 <?php
2
3 // Sécurité
4 if (!defined("_ECRIRE_INC_VERSION")) return;
5
6 /**
7 * Vérification d'une URL
8 *
9 * Si auncune option n'est définie, vérifie uniquement si un protocole de type web est défini
10 *
11 * @param string $valeur
12 * La valeur à vérifier.
13 * @param array $options
14 * mode : protocole_seul, php_filter, complet
15 * type_protocole : tous, web (http ou https), mail (imap, pop3, smtp), ftp (ftp ou sftp), exact
16 * protocole : nom du protocole (si type_protocole=exact)
17 * @return string
18 * Retourne une chaine vide si c'est valide, sinon une chaine expliquant l'erreur.
19 */
20 function verifier_url_dist($valeur, $options=array()){
21 if (!is_string($valeur))
22 return _T('erreur_inconnue_generique');
23
24 // Choix du mode de verification de la syntaxe des url
25 if (!$options['mode'] or !in_array($options['mode'], array('protocole_seul','php_filter','complet'))){
26 $mode = 'protocole_seul';
27 }
28 else{
29 $mode = $options['mode'];
30 }
31
32 // Choix du type de protocole à vérifier
33 if (!$options['type_protocole'] or !in_array($options['type_protocole'], array('tous','web','mail','ftp','exact'))){
34 $type_protocole = 'web';
35 }
36 else{
37 $type_protocole = $options['type_protocole'];
38 $protocole = '' ;
39 if ($type_protocole=='exact' && $options['protocole']){
40 $protocole = $options['protocole'];
41 }
42 }
43
44 $fonctions_disponibles = array('protocole_seul' => 'verifier_url_protocole', 'php_filter' => 'verifier_php_filter', 'complet' => 'verifier_url_complet');
45 $fonction_verif = $fonctions_disponibles[$mode];
46
47 return $fonction_verif($valeur,$type_protocole,$protocole) ;
48
49 }
50
51 /**
52 * Vérifier uniquement la présence d'un protocole
53 *
54 * @param string $valeur La valeur à vérifier
55 * @param string $type_protocole : tous, web (http ou https), mail (imap, pop3, smtp), ftp (ftp ou sftp), exact
56 * @param string $protocole : nom du protocole (si type_protocole=exact)
57 * @return boolean Retourne true uniquement lorsque l'url est valide
58 */
59 function verifier_url_protocole($url,$type_protocole,$protocole){
60
61 $urlregex = array('tous' => "^([a-z0-9]*)\:\/\/.*$",
62 'web' => "^(https?)\:\/\/.*$",
63 'ftp' => "^(s?ftp)\:\/\/.*$",
64 'mail' => "^(pop3|smtp|imap)\:\/\/.*$",
65 'exact' => "^(".$protocole.")\:\/\/.*$");
66
67 $msg_erreur = array('tous' => "",
68 'web' => "http://, https://",
69 'ftp' => "^ftp://, sftp://",
70 'mail' => "pop3://, smtp://, imap://",
71 'exact' => $protocole."://" );
72
73
74 if (!eregi($urlregex[$type_protocole], $url)) {
75 if($type_protocole=="tous") {
76 return _T('verifier:erreur_url_protocole_exact', array('url' => echapper_tags($url)));
77 } else {
78 return _T('verifier:erreur_url_protocole', array('url' => echapper_tags($url),'protocole' => $msg_erreur[$type_protocole]));
79 }
80 }
81 return '';
82 }
83
84 /**
85 * Vérifier uniquement la présence d'un protocole
86 *
87 * @param string $valeur La valeur à vérifier
88 * @param string $type_protocole : tous, web (http ou https), mail (imap, pop3, smtp), ftp (ftp ou sftp), exact
89 * @param string $protocole : nom du protocole (si type_protocole=exact)
90 * @return boolean Retourne true uniquement lorsque l'url est valide
91 */
92 function verifier_php_filter($url,$type_protocole,$protocole){
93
94 if (!filter_var($url, FILTER_VALIDATE_URL))
95 return _T('verifier:erreur_url', array('url' => echapper_tags($valeur)));
96 return '';
97 }
98
99 /**
100 * Vérifier la présence d'un protocole et de la bonne syntaxe du reste de l'url
101 *
102 * http://phpcentral.com/208-url-validation-in-php.html
103 * <http[s]|ftp> :// [user[:pass]@] hostname [port] [/path] [?getquery] [anchor]
104 *
105 * @param string $valeur La valeur à vérifier
106 * @param string $type_protocole : web (http ou https), mail (imap, pop3, smtp), ftp (ftp ou sftp), exact
107 * @param string $protocole : nom du protocole (si type_protocole=exact)
108 * @return boolean Retourne true uniquement lorsque l'url est valide
109 */
110 function verifier_url_complet($url,$type_protocole,$protocole){
111
112 if($msg=verifier_url_protocole($url,$type_protocole,$protocole)!=''){
113 return $msg;
114 }
115 // SCHEME
116 $urlregex = "^(.*)\:\/\/";
117
118 // USER AND PASS (optional)
119 $urlregex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?";
120
121 // HOSTNAME OR IP
122 $urlregex .= "[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)*"; // http://x = allowed (ex. http://localhost, http://routerlogin)
123 //$urlregex .= "[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)+"; // http://x.x = minimum
124 //$urlregex .= "([a-z0-9+\$_-]+\.)*[a-z0-9+\$_-]{2,3}"; // http://x.xx(x) = minimum
125 //use only one of the above
126
127 // PORT (optional)
128 $urlregex .= "(\:[0-9]{2,5})?";
129 // PATH (optional)
130 $urlregex .= "(\/([a-z0-9+\$_%,-]\.?)+)*\/?";
131 // GET Query (optional)
132 $urlregex .= "(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?";
133 // ANCHOR (optional)
134 $urlregex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?\$";
135
136 if (!eregi($urlregex, $url))
137 return _T('verifier:erreur_url', array('url' => echapper_tags($valeur)));
138 return '';
139 }