Получение абсолютного пути внешних изображений веб-страницы

Я работаю над букмарклетом, и я извлекаю все фотографии любой внешней страницы с помощью HTML DOM parser (как было предложено ранее SO ответ). Я правильно загружаю фотографии и показываю, что в моем букмарклет всплывает. Но у меня проблема с относительным путем фотографий.

например, источник фотографий на внешней странице: http://www.example.com/dir/index.php

  1. фото Источник 1: img source = 'hostname / photos / photo.jpg' – Получение фото как абсолютного

  2. photo Источник 2: img source = '/ photos / photo.jpg' – не получается, поскольку он не является абсолютным.

Я работал через текущий url, я имею в виду использование dirname или pathinfo для получения каталога по текущему URL-адресу. но вызывает проблему между хостом / dir / (дает хост как родительский каталог) и host / dir / index.php (хост / dir как родительский каталог, который является правильным)

Пожалуйста, помогите Как я могу получить эти относительные фотографии?

Related of "Получение абсолютного пути внешних изображений веб-страницы"

FIXED (добавлена ​​поддержка только путей изображения только для строки запроса)

 function make_absolute_path ($baseUrl, $relativePath) { // Parse URLs, return FALSE on failure if ((!$baseParts = parse_url($baseUrl)) || (!$pathParts = parse_url($relativePath))) { return FALSE; } // Work-around for pre- 5.4.7 bug in parse_url() for relative protocols if (empty($baseParts['host']) && !empty($baseParts['path']) && substr($baseParts['path'], 0, 2) === '//') { $parts = explode('/', ltrim($baseParts['path'], '/')); $baseParts['host'] = array_shift($parts); $baseParts['path'] = '/'.implode('/', $parts); } if (empty($pathParts['host']) && !empty($pathParts['path']) && substr($pathParts['path'], 0, 2) === '//') { $parts = explode('/', ltrim($pathParts['path'], '/')); $pathParts['host'] = array_shift($parts); $pathParts['path'] = '/'.implode('/', $parts); } // Relative path has a host component, just return it if (!empty($pathParts['host'])) { return $relativePath; } // Normalise base URL (fill in missing info) // If base URL doesn't have a host component return error if (empty($baseParts['host'])) { return FALSE; } if (empty($baseParts['path'])) { $baseParts['path'] = '/'; } if (empty($baseParts['scheme'])) { $baseParts['scheme'] = 'http'; } // Start constructing return value $result = $baseParts['scheme'].'://'; // Add username/password if any if (!empty($baseParts['user'])) { $result .= $baseParts['user']; if (!empty($baseParts['pass'])) { $result .= ":{$baseParts['pass']}"; } $result .= '@'; } // Add host/port $result .= !empty($baseParts['port']) ? "{$baseParts['host']}:{$baseParts['port']}" : $baseParts['host']; // Inspect relative path path if ($relativePath[0] === '/') { // Leading / means from root $result .= $relativePath; } else if ($relativePath[0] === '?') { // Leading ? means query the existing URL $result .= $baseParts['path'].$relativePath; } else { // Get the current working directory $resultPath = rtrim(substr($baseParts['path'], -1) === '/' ? trim($baseParts['path']) : str_replace('\\', '/', dirname(trim($baseParts['path']))), '/'); // Split the image path into components and loop them foreach (explode('/', $relativePath) as $pathComponent) { switch ($pathComponent) { case '': case '.': // a single dot means "this directory" and can be skipped // an empty space is a mistake on somebodies part, and can also be skipped break; case '..': // a double dot means "up a directory" $resultPath = rtrim(str_replace('\\', '/', dirname($resultPath)), '/'); break; default: // anything else can be added to the path $resultPath .= "/$pathComponent"; break; } } // Add path to result $result .= $resultPath; } return $result; } 

тесты:

 echo make_absolute_path('http://www.example.com/dir/index.php','/photos/photo.jpg')."\n"; // Outputs: http://www.example.com/photos/photo.jpg echo make_absolute_path('http://www.example.com/dir/index.php','photos/photo.jpg')."\n"; // Outputs: http://www.example.com/dir/photos/photo.jpg echo make_absolute_path('http://www.example.com/dir/index.php','./photos/photo.jpg')."\n"; // Outputs: http://www.example.com/dir/photos/photo.jpg echo make_absolute_path('http://www.example.com/dir/index.php','../photos/photo.jpg')."\n"; // Outputs: http://www.example.com/photos/photo.jpg echo make_absolute_path('http://www.example.com/dir/index.php','http://img.ruphp.com/php/photo.jpg')."\n"; // Outputs: http://img.ruphp.com/php/photo.jpg echo make_absolute_path('http://www.example.com/dir/index.php','?query=something')."\n"; // Outputs: http://www.example.com/dir/index.php?query=something 

Я думаю, что это должно касаться всего того, что вы, вероятно, встретите правильно, и должно приравниваться к логике, используемой браузером. Также следует исправить любые странности, которые вы могли бы получить в Windows с помощью блуждающих косых dirname() используя dirname() .

Первый аргумент – полный URL-адрес страницы, на которой вы нашли <img> (или <a> или что-то еще), а второй аргумент – это содержимое атрибута src / href etc.

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

'/' должен быть базовым. Проверьте первый символ, возвращаемый из вашего синтаксического анализатора, и если это «/», просто укажите его имя домена.