Это только скажет вам, если URL существует, поэтому вводить в заблуждение даже сказать, что он найдет «изображение», потому что он найдет «что-нибудь».

ьзуя PHP, учитывая URL, как я могу определить, является ли это изображение?

Для URL нет контекста - он находится просто в середине простого текстового файла или, может быть, просто в отдельной строке.

Я не хочу больших накладных расходов (например, чтение содержимого URL), так как это может быть вызвано для многих URL на странице. Учитывая это ограничение, необязательно, чтобы все изображения были идентифицированы, но я хотел бы получить довольно хорошее предположение.

На данный момент я просто смотрю на расширение файла, но кажется, что должен быть лучший способ, чем этот.

Вот что у меня сейчас есть:

  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;
  }

Редактировать: В случае, если это пригодится кому-то еще, вот последняя функция, использующая технику из ответа Эмиля Х:

  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;
  }

Ответы на вопрос(8)

Ваш ответ на вопрос