Как слизать внутренние ссылки со страницы сайта

lunux

Новичок
Как слизать внутренние ссылки со страницы сайта

Здравствуйте уважаемые :)
Помогите, как говорится - кто чем может … Ситуация такая: «считывается Интернет страница нужно слизать с неё внутренние ссылки» - т.е. ссылки ведущие на страницы именно этого сайта.
 

Lexx918

Guest
У меня подобная проблема, только я не могу "выкинуть" ненужные ссылки на мыла. Делаю вот так:
"/(href=\"([^\"]+)\")/"
В итоге получаю все ссылки, как на другие страницы, так и на E-mail адреса. Если добавить вот так:
"/(href=\"mailto:([^\"]+)\")/"
то получу только мыла, а как сделать наоборот???
 

Lexx918

Guest
Спасибо, но я это всё прочитал.
Если ставить ^ вне квадратных скобок, то это маркер начала строки, если внутри, то это отрицание всего, что внутри скобок.
А как сделать отрицание группы символов?
То есть если я пишу [^mailto:], то отбрасываю все ссылки, где встрчается любая из букв m,a,i,l,t,o,:.
Если пишу [^(mailto:)], то вааще не пашет
 

SelenIT

IT-лунатик :)
Честно говоря, выглядит скорее как описание результатов экспериментирования "вслепую", а не прочтения ссылки ;)

А в том подразделе, на который давал ссылку я, речь шла о вещах наподобие
'/(?<=href")(?<!mailto:)([^"]+)(?:")/'
 

Lexx918

Guest
Точно! Есть такая тема. Простите, не понял тогда. Да и ща там не очень ясно особенно про предшествующий текст.
В любом случае ваш пример не пашет, а
preg_match_all('/(?<=href")(?<!mailto:)([^"]+)(?:")/', $buffer, $ar);
print_r ($ar);
возвращает Array()
типа "массив пуст"
З.Ы. И ещё: куда исчезает двоеточие из примера (при редактировании поста оно снова есть)?

-~{}~ 30.07.05 02:49:

Вот так вроде пашет
PHP:
preg_match_all('/href="(?!mailto:[i])[/i]([^"]+)"/', $this->buffer, $ar, PREG_SET_ORDER);
-~{}~ 30.07.05 03:00:

теперь возникает другой вопрос:
а как быть с относительными ссылками? как грамотно "приклеить" к ним тот путь, который уже пройден от корня домена.
трудность возникает, если текущий каталог не есть корень сайта и имеет вид похожий на файл с расширением.
если путь был http://127.0.0.1/path/ и появилась ссылка типа
href="path2/", то я конечно её приклею, а если href="path.php?var=value" при том, что path.php не файл, а каталог!?
и что делать, если крайнего слеша нету вообще?
парсить URL тоже не выход :(
 

ZiBoX

Новичок
Re: Как слизать внутренние ссылки со страницы сайта

PHP:
preg_match_all("/<[Aa][ \r\n\t]{1}[^>]*[Hh][Rr][Ee][Ff][^=]*=[ '\"\n\r\t]*([^ \"'>\r\n\t#]+)[^>]*>/",$buf,$urls);// выдираем все ссылки
for ($c_urls=0;$c_urls<count(@$urls[1]);$c_urls++) {
echo $urls[1][$c_urls];// выводим на экран
}
$buf - подгружаемая страница

-~{}~ 30.07.05 01:13:

Автор оригинала: Lexx918
теперь возникает другой вопрос:
а как быть с относительными ссылками? как грамотно "приклеить" к ним тот путь, который уже пройден от корня домена.
трудность возникает, если текущий каталог не есть корень сайта и имеет вид похожий на файл с расширением.
если путь был http://127.0.0.1/path/ и появилась ссылка типа
href="path2/", то я конечно её приклею, а если href="path.php?var=value" при том, что path.php не файл, а каталог!?
и что делать, если крайнего слеша нету вообще?
парсить URL тоже не выход :(
PHP:
// Проверяем если ссылка на локальный документ (test.htm) приделываем ей изначальный урл ([url]http://server/test.htm[/url]) [BEGIN]
if (strtolower((substr($naid_url, 0, 7))!="http://")){
//_log("[+] ".$naid_url);
$razb_url=explode("/",$scan_url);
$curl=count($razb_url);
if (empty($razb_url[$curl-1])){
$naid_url=str_replace("/","",$naid_url);
$naid_url=$scan_url.$naid_url;
}else{
$g_url="";
for ($iz=0;$iz<$curl-1;$iz++){
$g_url=$g_url.$razb_url[$iz]."/";
}

$naid_url=$g_url.$naid_url;
}//end if (empty($nourl[$curl]-1))){
}///end if http
// Проверяем если ссылка на локальный документ (test.htm) приделываем ей изначальный урл ([url]http://server/test.htm[/url]) [END]
$naid_url - найденная ссылка
$scan_url - первоначальная ссылка на страницу
Тупо, но работает! :p
 

SelenIT

IT-лунатик :)
ZiBoX
Советую освоить модификатор i (регистронезависимость) и общие типы символов наподобие \s (любой пробельный символ). Уверяю, жить станет проще :)
 

Lexx918

Guest
PHP:
if (strtolower((substr($naid_url, 0, 7))!="http://")) {
Это конечно хорошо, но как быть с кучей других протоколов? И главное как быть с ссылками вида www.server.domen/bla-bla-bla.htm? Любой броузер автоматически вставляет всю эту лабуду.
Всё таки парсить URL надо, а потом уже искать дальнейший геммор там.
Допустим это можно сделать. Последний шаг обойти защиту от грабления сайтов типа
PHP:
<a href="vasya_pupkin" onmouseover="this.href='htt'+'p://'+'www.'+'serv'+'er.ru/'+'path/'">super_link</a>
-~{}~ 30.07.05 15:44:

Не прошло и года, а ещё одна проблема уже мешает спать! Дабы позже не возникло проблем с проксями, решено было использовать
PHP:
fsockopen();
Но любой прошаренный ресурс (в особенности это касается форумов), при открытии соединения выдаёт (а как не дать!) граберу 32 символа сессии. Все URL'ы превращаются в уникальные и обрабатываются в порядке очереди, после чего соединение закрывается. При новом соединении сессия имеет уже иной вид и ТЕ ЖЕ самые ссылки воспринимаются как уникальные по второму и третьему кругу. Мля...!
Как быть?
 

pitbull

Новичок
Задача надо было приклеить ко всем ссылка страницы уникальный идентификатор типа "rand=0.1256488".
Вот, почитал топик, походил по линкам... в итоге получилось так:
PHP:
<?php
ob_start();
?> 
<!--Много-много ссылок и текста-->
<?php
  function preg_callback($matches) {
    $link=$matches[2]; $s="0.";
    for ($i=0; $i<15; $i++) {
      $s=$s.rand(0,9);
    };
    if (strpos($link,"?")==0) {
      $s="?rand=".$s;
    } else {
      $s="&rand=".$s;
    };
    $link=$link.$s;
    return "href=\"$link\"";
  };
 
  function rnd_link($ctn){
    $ctn=preg_replace_callback("#(href=\"?[(:?https?|ftp)://]*([a-z0-9+-=\\$\&\%\#\@\^*().,/)\];\'\\!?]*)\"?)#is","preg_callback",$ctn);
    return $ctn;
  };
  
  //Обработка и вывод буфера
  $ctn=ob_get_contents();
  ob_end_clean();
  $ctn=rnd_link($ctn);
  echo $ctn;
?>
Работает :)
 
Сверху