L'autre jour, j'avais besoin en php de vérifier qu'une valeur était bien un nombre hexadécimal, puis de le convertir en décimal. Pour convertir un hexadécimal en décimal, on peut utiliser la fonction hexdec. Mais, comme spécifié, elle ignorera tout caractère non-hexadécimal qu'elle rencontrera. Du coup, la chaîne 0xAMB est considérée comme 0xAB, et on ne peut pas savoir, avec hexdec, si la chaîne convertie est valide.

Pour réaliser cette validation, il y a, depuis la version 5.2 de php[1] , la fonction filter_var. Elle filtre une variable avec un filtre spécifique. En l'occurence, on peut utiliser le filtre FILTER_VALIDATE_INT avec le drapeau FILTER_FLAG_ALLOW_HEX. L'instruction suivante:

filter_var($input, FILTER_VALIDATE_INT, array( 'flags'   => FILTER_FLAG_ALLOW_HEX))

renverra false si la chaîne d'entrée n'était pas valide, ou bien, l'entier converti si elle était valide.

La fonction filter_var est très souple : elle permet d'utiliser un grand nombre de filtres. On peut par exemple tester si une chaîne est une adresse ip, une url, ou bien même une adresse email valide. Ainsi, l'instruction suivante :

filter_var($input, FILTER_VALIDATE_EMAIL);

permet de valider une adresse email. Pour les curieux, l'adresse est validée suivant une expression rationnelle inspirée de celle utilisée par HTML_QuickForm.

Notes

[1] Pour les versions antérieures, il semble qu'il existe une extension PECL