Если ваши проблемы коренятся в разрешении относительных ссылок из документа и разрешении в абсолютный (что составляет половину работы по отображению путей связанных изображений в файловую систему), я обычно использую Net_URL2
из груши .Это простой класс, который просто выполняет свою работу.
Чтобы установить в качестве пользователя root, просто позвоните
# pear install channel://pear.php.net/Net_URL2-0.3.1
Даже если это бета-пакет, он действительно стабилен.
AНебольшой пример, скажем, есть массив со всеми рассматриваемыми srcs-изображениями и базовый URL для документа:
require_once('Net/URL2.php');
$baseUrl = 'http://www.example.com/test/images.html';
$docSrcs = array(...);
$baseUrl = new Net_URL2($baseUrl);
foreach($docSrcs as $href)
{
$url = $baseUrl->resolve($href);
echo ' * ', $href, ' -> ', $url->getURL(), "\n";
// or
echo " $href -> $url\n"; # Net_URL2 supports string context
}
Это преобразует любые относительные ссылки в абсолютные на основе вашего базового URL.,Базовый URL - это прежде всего адрес документа.Документ может переопределить его, указав другой с элементом base
Документы .Таким образом, вы можете посмотреть это с помощью уже используемого вами анализатора HTML (а также значений src
и href
).
Net_URL2
отражает текущий RFC 3986 для разрешения URL.
Еще одна вещь, которая может пригодиться для обработки вашего URL - это функция getNormalizedURL
.Он удаляет некоторые потенциальные случаи ошибок, такие как ненужные точечные сегменты и т. Д., Что полезно, если вам нужно сравнить один URL-адрес с другим и, естественно, для сопоставления URL-адреса с путем:
foreach($docSrcs as $href)
{
$url = $baseUrl->resolve($href);
$url = $url->getNormalizedURL();
echo " $href -> $url\n";
}
можно разрешить все URL-адреса до абсолютных, и вы получите их нормализованные, вы можете решить, будут ли они интересны для вашего сайта, если URL-адрес по-прежнему является экземпляром Net_URL2
, вы можете использовать одну из многих функций, чтобы сделатьчто:
$host = strtolower($url->getHost());
if (in_array($host, array('example.com', 'www.example.com'))
{
# URL is on my server, process it further
}
Слева указан конкретный путь к файлу в URL:
$path = $url->getPath();
Этот путь, если вы сравниваете его с файловой системой UNIX, должен быть простымпрефикс с конкретным базовым каталогом:
$filesystemImagePath = '/var/www/site-new/images';
$newPath = $filesystemImagePath . $path;
if (is_file($newPath))
{
# new image already exists.
}
Если у вас есть проблемы с объединением базового пути с путем изображения, путь к изображению всегда будет иметь косую черту в начале.
Надеюсь это поможет.