Ссылки на веб-сканер / логика страниц в PHP - PullRequest
1 голос
/ 12 декабря 2008

Я пишу базовый сканер, который просто кэширует страницы с помощью PHP.

Все, что он делает, это использует get_file_contents, чтобы получить содержимое веб-страницы, и регулярное выражение, чтобы вывести все ссылки <a href="URL">DESCRIPTION</a> - в тот момент, когда он возвращает:

Array {
[url] => URL
[desc] => DESCRIPTION
}

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

Это может быть любое количество комбинаций: то есть href="../folder/folder2/blah/page.html" или href="google.com" или href="page.html" - возможности безграничны.

Каким будет правильный алгоритм для этого? Я не хочу терять какие-либо данные, которые могут быть важны.

Ответы [ 3 ]

3 голосов
/ 12 декабря 2008

Прежде всего, регулярные выражения и HTML не смешиваются. Использование:

foreach(DOMDocument::loadHTML($source)->getElementsByTagName('a') as $a)
{
  $a->getAttribute('href');
}

Ссылки, которые могут выходить за пределы вашего сайта, начинаются с протокола или //, т.е.

http://example.com
//example.com/

href="google.com" - ссылка на локальный файл.

Но если вы хотите создать статическую копию сайта, почему бы просто не использовать wget?

1 голос
/ 15 декабря 2008

Давайте сначала рассмотрим свойства локальных ссылок.

Это будет либо:

  • относительно без схемы и без хоста или
  • абсолютный со схемой 'http' или 'https' и host , который соответствует машине, с которой скрипт работает

Это вся логика, которую вам нужно определить, если ссылка локальная.

Используйте функцию parse_url , чтобы отделить различные компоненты URL для идентификации схемы и host .

0 голосов
/ 12 декабря 2008

Вам нужно поискать http: // в href. Иначе, вы можете определить, начинается ли он с ./ или с любой комбинации "./" Если вы не найдете «/», то вам придется предположить, что это файл. Хотите сценарий для этого?

...