Преобразовать относительный URL-адрес в абсолютный URL-адрес с помощью простого HTML-DOM?

Когда я очищаю содержимое с некоторых страниц, скрипт дает относительный URL. Можно ли получить абсолютный URL-адрес с помощью Simple HTML DOM?

Я не думаю, что простой HTML DOM Parser может это сделать.

Но вы можете сделать это самостоятельно. Сначала вам нужно отличить базовый URI, который является URI документа, если не объявлен иначе (см. Элемент BASE ). Затем получите каждую ссылку на URI и примените алгоритмы для разрешения относительного URI, как описано в RFC 3986 (уже существуют классы, которые вы можете использовать для этого, как пакет PEAR Net_URL2 ).

Итак, используя эти два класса, вы можете сделать что-то вроде этого:

 $uri = new Net_URL2('http://example.com/foo/bar'); // URI of the resource $baseURI = $uri; foreach ($html->find('base[href]') as $elem) { $baseURI = $uri->resolve($elem->href); } foreach ($html->find('*[src]') as $elem) { $elem->src = $baseURI->resolve($elem->src)->__toString(); } foreach ($html->find('*[href]') as $elem) { if (strtoupper($elem->tag) === 'BASE') continue; $elem->href = $baseURI->resolve($elem->href)->__toString(); } foreach ($html->find('form[action]') as $elem) { $elem->action = $baseURI->resolve($elem->action)->__toString(); } 

Повторите подстановку для любого другого атрибута, содержащего URI, например, background , cite , classid , codebase , data , longdesc , profile и usemap (см. Индекс атрибутов в HTML 4.01 ).

В дополнение к ответу @ Artefacto, и если вы выгружаете скопированный HTML-код где-то, вы можете просто добавить <base href="http://example.com"> в начало документа, в котором будет установлен базовый URL-адрес для всех относительные URL-адреса в документе в качестве указанного href . Взгляните на http://www.w3schools.com/tags/tag_base.asp

EDIT См. Ответ Gumbo для формально правильного ответа. Это упрощенный алгоритм, который будет работать в подавляющем большинстве случаев, но не сработает.

Конечно. Сделай это:

  • Возьмите относительный URL (URL-адрес, который не начинается с http:// , https:// или любого другого протокола, а также не начинается с / ).
  • Возьмите URL-адрес страницы.
  • Удалите из него строку запроса (если есть). Один простой способ – explode ? а затем возьмите первый элемент результирующего массива (возьмите элемент с индексом 0 или используйте reset ).
    • Если URL-адрес страницы заканчивается на / , добавьте ее относительный URL-адрес, и у вас есть конечный URL-адрес.
    • Если URL-адрес не заканчивается на / , возьмите dirname из него и добавьте его относительный URL-адрес. Теперь у вас есть конечный URL.