Преобразовать относительный URL в абсолютный URL с помощью Simple HTML DOM? - PullRequest
3 голосов
/ 25 июля 2010

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

Ответы [ 3 ]

12 голосов
/ 25 июля 2010

Я не думаю, что Simple 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 ).

0 голосов
/ 25 июля 2010

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

0 голосов
/ 25 июля 2010

РЕДАКТИРОВАТЬ См. Ответ Гамбо для формально правильного ответа. Это упрощенный алгоритм, который будет работать в подавляющем большинстве случаев, но в некоторых не работает.

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

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