En utilisant PHP, étant donné une URL, comment puis-je déterminer s'il s'agit d'une image ?
Il n'y a pas de contexte pour l'URL - elle se trouve juste au milieu d'un fichier texte brut, ou peut-être juste une chaîne de caractères en soi.
Je ne veux pas de frais généraux élevés (par exemple, la lecture du contenu de l'URL), car cela pourrait être appelé pour de nombreuses URL sur une page. Compte tenu de cette restriction, il n'est pas essentiel que toutes les images soient identifiées, mais j'aimerais avoir une idée assez précise.
Pour l'instant, je me contente de regarder l'extension du fichier, mais j'ai l'impression qu'il devrait y avoir un meilleur moyen.
Voici ce que j'ai actuellement :
function isImage( $url )
{
$pos = strrpos( $url, ".");
if ($pos === false)
return false;
$ext = strtolower(trim(substr( $url, $pos)));
$imgExts = array(".gif", ".jpg", ".jpeg", ".png", ".tiff", ".tif"); // this is far from complete but that's always going to be the case...
if ( in_array($ext, $imgExts) )
return true;
return false;
}
Edit : Au cas où cela pourrait être utile à quelqu'un d'autre, voici la fonction finale utilisant la technique de la réponse d'Emil H :
function isImage($url)
{
$params = array('http' => array(
'method' => 'HEAD'
));
$ctx = stream_context_create($params);
$fp = @fopen($url, 'rb', false, $ctx);
if (!$fp)
return false; // Problem with url
$meta = stream_get_meta_data($fp);
if ($meta === false)
{
fclose($fp);
return false; // Problem reading data from url
}
$wrapper_data = $meta["wrapper_data"];
if(is_array($wrapper_data)){
foreach(array_keys($wrapper_data) as $hh){
if (substr($wrapper_data[$hh], 0, 19) == "Content-Type: image") // strlen("Content-Type: image") == 19
{
fclose($fp);
return true;
}
}
}
fclose($fp);
return false;
}