Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Скрипт индексации страниц домена. Затруднение.
 
 автор: [CHOL]Scorpion   (31.07.2005 в 17:20)   письмо автору
 
 

Предисловие:
возникла необходимость сделать поиск по сайту. Разуеется делать поиск по каждому разделу вручную как то обламывает.

Написал скриптик, протестил, работает, но как то коряво. Тоесть стартовую страницу сканит, сслки находит все. По второму заходу и так далее недощитался достаточно многих ссылок.

Вот код, елси кто может помочь советом как заставить скрипт работать как надо, поделитесь мнением.


<?php

$links 
= array("http://".$_SERVER['SERVER_NAME']);

function 
index_page($links){
$url $links;
$fd = @fopen($url"r"); 
if (
$fd) while (!feof ($fd)) $text .= fgets($fd4096); 

if (
$fd){
$text str_replace("\"","",$text);           
$text str_replace("'","",$text);
preg_match_all("/<a.+href.+>.+<\/a>/i",$text,$matches);
$pli 0;


if (
count($matches) != 0){
    for (
$i=0$i<count($matches); $i++){    
         for (
$j=0$j<count($matches[$i]); $j++){
              if (
ereg("<a.+href=(.+)>.+</a>",$matches[$i][$j],$regs)){
                  
$regs[1] = str_replace("\"","",$regs[1]);                  
                  
$regs[1] = eregi_replace("[[:space:]].+","",$regs[1]);                  
                  if (
eregi("^http://",$regs[1]) && !eregi("^http://".$_SERVER['SERVER_NAME'],$regs[1])){
                      unset(
$regs[1]);
                  }            
                  if (
eregi("^www",$regs[1]) && !eregi("^".$_SERVER['SERVER_NAME'],$regs[1])){
                      unset(
$regs[1]);
                  }            
                  if (
eregi("mailto",$regs[1])){
                      unset(
$regs[1]);
                  }
                  if (IsSet(
$regs[1]) && !Empty($regs[1])){
                      if (!
eregi("^www",$regs[1]) && !eregi("^http",$regs[1])){
                          
$regs[1] = "http://".$_SERVER['SERVER_NAME']."/".$regs[1];
                      }
                      if (
eregi("^www",$regs[1])){
                          
$regs[1] = "http://".$regs[1];
                      }
                      if (!
in_array($regs[1],$GLOBALS['links'])){                          
                          
array_push($GLOBALS['links'],$regs[1]);                          
                          echo 
$regs[1]."<BR>";
                      }
                  }
              }
         }
    }
}
}
}

array_walk($links,'index_page');


?>

   
 
 автор: cheops   (31.07.2005 в 18:22)   письмо автору
 
   для: [CHOL]Scorpion   (31.07.2005 в 17:20)
 

Зря конструкции .+ в регулярных выражениях используете - добра от них не дождётесь, лучше заменить на ограничения [^...] где ... - символ ограничения.

   
 
 автор: [CHOL]Scorpion   (31.07.2005 в 21:40)   письмо автору
 
   для: cheops   (31.07.2005 в 18:22)
 

Спасибо за совет.

Только всё это будет напрасно, елси не понять в чём баг ... По сути, при каждом прохождении в массив дописываются новые уникальные ссылки ... Ну а arry_walk пока не дойдёт до конца массива, не должна прерываться. Проблема в том, что я недощитался ссылок. И дело не в том что глючат регулярки. Скажем он ссылку определяет, но явно не переходит по ней для индексирования ... в то время как по другой ссылке переходит. Вот я и думаю, в чём тут проблема ...

   
 
 автор: cheops   (31.07.2005 в 22:55)   письмо автору
 
   для: [CHOL]Scorpion   (31.07.2005 в 21:40)
 

Вот чего не понятно, ведь функция index_page() вызывается только один раз, и следовательно будет проанализирован только корень - ведь функция не пойдёт по ссылкам, которые добавляются по ходу дела... ссылки это как деревья, здесь нужно что-то рекурсивное, причём с контролем, чтобы не было зацикливаниея... Т.е. он проанализирует ссылки на корневой странице и не пойдёт дальше, так как array_walk() скорее всего не учитывает уже элементы массива добавленные после её вызова.

   
 
 автор: [CHOL]Scorpion   (01.08.2005 в 08:12)   письмо автору
 
   для: cheops   (31.07.2005 в 22:55)
 

Может быть ... Попробую рекурсию (хотя хотел от неё уйти :()

PS: а учесть уже проиндексированные ссылки это не проблема. Просто ещё один массив, а в нём значение - 0 (ссылка не проиндексирована) и 1 (проиндекскирована).

   
 
 автор: cheops   (01.08.2005 в 11:30)   письмо автору
 
   для: [CHOL]Scorpion   (01.08.2005 в 08:12)
 

>PS: а учесть уже проиндексированные ссылки это не проблема.
>Просто ещё один массив, а в нём значение - 0 (ссылка не
>проиндексирована) и 1 (проиндекскирована).
Да я тоже про это подумал :)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования