Разобрать ссылку: относительную, абсолютную или URL, чтобы найти расширение - PullRequest
1 голос
/ 16 февраля 2011

У меня есть этот код

$ext = strtolower( pathinfo($source, PATHINFO_EXTENSION) );

Затем у меня есть куча if операторов, которые определяют, какой код запускать на основе расширения.Теперь вот моя сложная часть.$ source может быть либо локальным путем "media / images / me.png", либо любым другим файлом (например, в формате jpg в формате mp3 и т. д.), ИЛИ может быть ссылкой, например

http://www.google.com.au/images/nav_logo36.png

Мой pathinfo правильно разбирает вышеуказанную вещь.Сбой, когда я добавляю что-то в конец, например строку запроса

http://www.google.com.au/images/nav_logo36.png?me=1 возвращает png?me=1

или

http://www.google.com.au/images/nav_logo36.png&s=3 возвращает png&s=3

или даже хуже

http://www.google.com.au/images/nav_logo36.png?j=p3nd&new_ext=.png возвращает png

или, возможно, хуже

http://www.google.com.au/images/nav_logo36.png&j=p3nd&new_ext=.png (& вместо?)

Какой лучший способ справиться с этим?Я думаю об удалении строки запроса перед началом, но не знаю, как.

спасибо.

LAMP / PHP 5.2

РЕДАКТИРОВАТЬ

Требования: мне нужно расширение файла.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

Это зависит от того, что вам нужно. Если полученная вами информация находится где-то в URL, вы можете взглянуть на функцию parse_url(). Согласно инструкции php:

<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';

print_r(parse_url($url));

echo parse_url($url, PHP_URL_PATH);
?>

The above example will output:

Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)
/path

и это дает вам каждую часть URL, так что вы можете работать с той, которая вам нужна.

Конечно, используя $ _SERVER ['QUERY_STRING'], вы просто получаете запрос и работаете над ним или удаляете его из полного URL, чтобы получить базовую ванну. Так как кажется, что вы говорите, что URL иногда не очень хорошо сформирован (использование & вместо? Для первого параметра), использование взрыва ('?', $ Url) может привести к непредсказуемым результатам.

1 голос
/ 16 февраля 2011

Это можно сделать достаточно надежно, используя библиотеку cURL, и curl_getinfo()

См .: http://www.php.net/manual/en/function.curl-getinfo.php

Единственная проблема заключается в том, что на самом деле запрос будет выполнен, поэтому он займетвремя получения ответа (может быть длинным для больших изображений).

Поэтому выбор между попыткой использовать расширение файла приведет к ненадежному результату, потому что:

  • Файл с .png в конце не обязательно является png-изображением
  • URL без расширения может довольно легко быть изображением (однако его можно обслуживать)

И имеячтобы получить ответ для проверки mimetype.

Вот пример кода, если вы хотите попробовать его.Это приводит к извлечению логотипа Google на австралийском веб-сайте и повторению mimetype, полученного в заголовке.

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://www.google.com.au/images/logos/ps_logo2.png');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_exec($ch);

if(!curl_errno($ch)) {
    $mimetype = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
    echo $mimetype;
}
else {
    die(curl_error($ch));
}

curl_close($ch);

Вы можете сделать еще один шаг и фактически загрузить файл и сохранить его где-нибудь, чтобы использовать расширение Fileinfo.

file_put_contents('tmp', 
    file_get_contents('http://www.google.com.au/images/logos/ps_logo2.png')
);

$finfo = finfo_open(FILEINFO_MIME_TYPE);

echo finfo_file($finfo, 'tmp');

finfo_close($finfo);

HTTP-заголовки могут быть отправлены для файлов, которые не относятся к этому типу.Fileinfo должен давать очень надежный результат, потому что он пытается угадать mimetype на основе определенных байтов в реальном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...