2010-01-13 8 views

Répondre

8

Cela ne vous dira pas si elle est vraiment une image. Cela ne vous dira ce qu'il semble être selon l'URL:

$url = "http://somedomain.com/images/kittens.jpg"; 
if(preg_match("/\.(png|jpeg|jpg|gif|bmp)$/i", $url)) { 
    print "Appears to be an image"; 
} else { 
    print "Not an image."; 
} 

Sorties:

 Appears to be an image

Notez que si vous vous attendez à voir des images grâce à des scripts alimentés .php ou scripts .aspx , cette méthode échouera. Pour avoir un test vraiment fiable, vous devrez vérifier le type mime.

+1

+1, parfois vous devez implémenter quelque chose de simple et efficace, vérifier les types mime peut-être bien, mais son imo exagéré .... –

+1

solution la plus rapide +1 – wprl

+0

De nombreux sites d'hébergement d'images servent une page HTML pour les URL se terminant par le fichier image extensions –

14

Vérifiez le type mime du fichier.

+0

solution la plus robuste +1 – wprl

+1

Mais cela nécessite de récupérer le fichier. L'OP voulait savoir à partir de la ** syntaxe ** si c'était une image ou non. Néanmoins, votre réponse est correcte bien sûr. –

+0

Vous avez raison. Ma faute. Quoi qu'il en soit ''/ \. (Png | jpg | gif | bmp) $/i'' n'est pas un bon moyen (sûr) non plus, mais c'est plus rapide et plus facile bien sûr. – kjagiello

3

Les URL sans image peuvent toujours diffuser des images en continu. Par exemple, une URL ashx ou asp peut vous renvoyer des données d'image. La meilleure façon est de vérifier le type MIME, Response.ContentType.

+0

Je mis à jour, mais même le type de contenu dans la réponse peut être falsifié ou tout simplement faux. – cjstehno

5

Je suggère réaliser une tête HTTP demande donc vous aurez pas besoin de télécharger l'image entière, puis en fonction de la chaîne retournée Parse et assurez-vous que le Content-Type est un image/jpeg, image/pjpeg, image/gif, ou image/png image similaire Types de contenu.

<?php 

function parseImage($url) { 
     $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 

    $content = curl_exec($ch); 

    var_dump($content); 
    curl_close($ch); 
} 

parseImage('http://sstatic.net/so/img/logo.png'); 

Retours

chaîne

« HTTP/1.1 200 OK

Cache-Control: max-age = 604800

Content-Length: 3438

Content-Type : image/png

Dernière modification ified: Sun, 10 Jan 2010 09:14:52 GMT

Accept-Ranges: bytes

ETag: "32741b5ed591ca1: 0"

serveur: Microsoft-IIS/7.5

date : Mer Jan 2010 20:37:47 13 GMT

'(longueur = 256)

Le Content-Type L'en-tête peut être usurpé, bien sûr ... mais 99% du temps ce ne sera pas, ce qui explique pourquoi cette méthode est fiable.

+1

Le type de contenu dans la réponse peut être falsifié. – kjagiello

+2

"Cela devrait fonctionner dans 99% des cas." –

1

J'ai upvoted la solution preg, mais si vous voulez vraiment, VRAIMENT savoir, puis télécharger le fichier et interroger en utilisant les fonctions du système (par exemple pour Linux utiliser file via exec).

2

Si vous avez vraiment besoin d'être sûr à 100%, vous devez télécharger la ressource et la vérifier en utilisant getimagesize().

+0

C'est ce à quoi je pensais, mais il veut une vérification de la syntaxe. +1 cependant. – Aif

1

Vous pouvez utiliser pathinfo pour obtenir l'extension:

echo pathinfo('http://www.blah.com/plo52.jpg', PATHINFO_EXTENSION); // jpg 

puis l'envelopper dans une fonction

function hasExtension($uri, array $extensions = array('jpg','gif','png')) 
{ 
    return in_array(pathinfo($uri, PATHINFO_EXTENSION), $extensions); 
} 

hasExtension('http://www.blah.com/plo52.jpg'); // true 

Cela permettra également de travailler sur les chemins de fichiers réguliers et en étant en mesure de passer l'extension $ tableau vous n'êtes pas limité au modèle regex. Notez que la fonction est sensible à la casse.

Voir cette question et des réponses pour how to best determine the MimeType of a file:

Questions connexes