Добрый день. Собственно, возникла задачка интересная, связанная с индексированием содержания сайта. Нужна функция, которая принимает два аргумента: 1) адрес ссылки, которую мы нашли в HTML коде-страницы. 2) абсолютная ссылка той страницы, на которой мы сейчас находимся. Функция должна вернуть: 1) FALSE, в случае, если ссылка является внешней, либо имеет протокол ftp://, ftps://, https://. Собственно это уже сделано. Это не сложно. Интереснее следующий пункт. 2) Если функция не вернула FALSE, то необходимо вернуть абсолютный путь первой полученной ссылки. Например назовем isInside($url, $main). Тогда PHP: isInside('http://www.google.ru/about.html', 'http://www.moysite.com/index.php') = FALSE //внешняя ссылка PHP: isInside('about.php', 'http://www.moysite.com/index.php') = [url=http://www.moysite.com/about.php]http://www.moysite.com/about.php[/url] Может кто уже имел дело с подобным? Подскажите пжл. Потому что с виду кажеться просто, а начал писать немного запутался в разнообразии ситуаций. Функция получается загроможденная и ужасно непонятная. Да и то, некоторые моменты пропускает. Может у кого есть решение или мысли как это сделать красиво? Заранее благодарен.
Горбунов Олег Спасибо за подсказку. До этого еще не добрался. Тут хоть бы с иерархическим заданием адреса разобраться.
Посмотри мой скрипт здесь: http://forum.antichat.ru/showpost.php?p ... tcount=352 Думаю, найдёшь то, что тебе надо
Да я уже понял. Только вот не пойму как она обрабатывает рекурсивное задание. Ну ссылки, типа "../about.php" И Олег Горбунов был прав - есть же еще BASE, который тоже надо учитывать.
PHP: <?php /** * Схлопывет путь: удаляет ../ и ./ из пути, не привязываясь к файловой системе * * @version 1.0 * @author Alex S Gousev <alex@gousev.ru> * * @param string $path путь в unix-формате * @return string|bool схлопнутый путь или false, если невозможно схлопнуть ../ */ function path_collapse($path) { # Избавляемся от ./ $path = preg_replace('%(\A|/)(?:\./)+%', '\1', $path); # Избавляемся от ../ while ($pos = strpos($path, '/../')) $path = preg_replace('%(\A|/)[^/]+/\.\./%', '\1', $path); if (preg_match('%\A/?\.\./%', $path)) return false; return $path; } ?>
Код (Text): <?php function isInside($url, $site) { $domain = parse_url($site); $domain = $domain['scheme'].'://'.$domain['host']; if($url{0} == '/') { $link = $domain.$url; } else if(preg_match('~^http(s)?:~i', $url)) { if(parse_url($url, PHP_URL_HOST) == parse_url($site, PHP_URL_HOST)) { $link = $url; } } else { if(!preg_match('~^(ftp(s)?|javascript|mailto):~i', $url)) { $dirname = ''; $explode = explode('/', parse_url($site, PHP_URL_PATH)); foreach($explode as $i => $dir) { if($dir && $i != (count($explode)-1)) { $dirname .= $dir.'/'; } } $link = $domain.'/'.$dirname.preg_replace('~(\A|/)\./~', '$1', $url); $regex = '~/(?!\.\./)[^\x2F]+/\.\./~'; while(preg_match($regex, $link)) { $link = preg_replace($regex, '/', $link); } } } return (isset($link) ? $link : false); } echo isInside('../../../phpinfo.html', 'http://php.ru/it/is/test/index.php'); ?> Немного обновил скрипт. Кому интересно, заходите сюда: http://forum.antichat.ru/showpost.php?p ... tcount=413
Ты немного не понял. Он утаскивает ссылки, начиная со страницы, которую ты сам объявишь в скрипте, заканчивая той, на которой новых ссылок нет. Вот пример. К примеру у тебя на компе есть файлы: Код (Text): [Урл файла] => [ссылки, указанные в файлах данного урла] 1.html => 1.html, 2.html 2.html => 5.html, 6.html 3.html => 1.html, 2.html 4.html => 4.html, page/1.html 5.html => 6.html, 3.html 6.html => 1.html, 4.html 7.html => 7.html, page/3.html page/1.html => 2.html, ../1.html page/2.html => 1.html, ../7.html page/3.html => 1.html, 2.html Если ты, в качестве начальной ссылки, указываешь 1.html, то на выводе будет примерно такое: Код (Text): http://localhost/1.html http://localhost/2.html http://localhost/3.html http://localhost/4.html http://localhost/5.html http://localhost/6.html http://localhost/7.html http://locahost/page/1.html http://locahost/page/2.html http://locahost/page/3.html Причём всё выдирается и выдаётся без повторений.