Вытаскивание всех ссылок при анализе HTML

Freetz

Guest
Вытаскивание всех ссылок при анализе HTML

Здравствуйте.
Предо мной стоит задача, проанализировав html-код узнать все ссылки на другие страницы этого сайта. Теперь конкретней.
Пусть в $adress у меня содержится название (url сайта). Для отыскания ссылок на другие страницы надо составить регулярное выражение:

/$adress\/+\w\/\.html|htm|php|shtml/

Мои вопросы: во-первых, как сделать чтобы $adress интерпретировалось именно как значение переменной, а не как символ конца строки и букв, составляющих слово address. Во-вторых, далее у меня идет +\w – любое количество (больше 1) вхождений словесных символов. Проблема в том, что в этом случае мне выведется вхождения только одного, самомго первого символа. Но ведь вместо этого мне надо фактически записать «любое количество любых символов», т.е. получить URI. Как сделать это?
Заранее спасибо за ответ.
 

Span

Новичок
можно было бы поробовать xml методы, если бы html был бы 100% xml валидным, то есть xhtml. Ты про мог бы искать все элементы <a> и получать значение аттрибута href.
 

valyala

Новичок
http://phpclub.ru/talk/showthread.php?threadid=53103 - вот тут уже обсуждалась проблема вытаскивания всех ссылок при анализе HTML. Внизу первой страницы темы даже приведена рабочая функция, выдирающая все ссылки из документа. Остается только удалить ссылки на другие сайты.
 

Freetz

Guest
Спасибо за ответы, в целом теперь решение понятно. Но все-таки в данных вами ссылках я не нашел ответа на один из своих вопросов - как использовать в регулярных выражениях переменные, ведь мне не нужны все урлы, мне нужны только относящиеся к данному сайту.
 

gromitus

Новичок
Никто не мешает вставлять в регулярное выражение переменную
то есть
PHP:
ereg("/".$adress."\/+\w\/\.html|htm|php|shtml/", $string);
 

Silent

Новичок
> ведь мне не нужны все урлы, мне нужны только относящиеся к данному сайту

Анализ ссылок это уже совсем другая проблема. Там ведь могут быть и относительные ссылки, ссылки от корня сайта, может быть тег <base ...>. Поэтому лучше сначала вытащить все ссылки, а потом уже отфильтровать.
 

Freetz

Guest
На счет отфильтровать.
Пусть у меня в массиве $urls - все урлы.
Делаю так:

FOR($i=0;$i<=$c;$i++){
if ( (!ereg("/".$adress."","$urls")) || (ereg("mailto","$urls")) || (ereg("?","$urls")) ) {
unset($urls[$i]);
}
}
Т.е. тем самым я хочу отрезать 1)Все ссылки, не содержащие имя сайта 2)все ссылки mailto 3)Все ссылки, которым должны передаваться параметры через ?

Но почему-то код выше мне такого результата не обеспечивает. Подскажите плиз (очень нужно) что я делаю не так. Может что-то с ereg-ами не то?

-~{}~ 03.10.04 12:55:

Что-то я вообще ничего не понимаю. К примеру, если даже задать в явном виде

if (!ereg("/phpclub\.ru/","$urls")) {
echo "$urls[$i]";
}

То на экран выводятся ссылки в т.ч. вида http://phpclub.ru/?m=talk

Но ведь этого быть не должно! Скажите - это глючит пхп или глючу я?
 

Freetz

Guest
Да, имелась в виду переменная. Часть проблем это решило.
Но почему теперь при выполнении такой команды (для сайта fcrubin.ru):

if ( !ereg("fcrubin","$urls[$i]") ) {
unset($urls[$i]);
}

Среди оставшихся элементов в массиве есть, например такой:

http://top.mail.ru/jump?from=314432
 

lucas

Guest
Смотри пример:
PHP:
$urls = array('http://top.mail.ru/jump?from=314432') ;
print_r($urls) ;

if (! ereg('fcrubin',$urls[0])) { unset($urls[0]) ; }
print_r($urls) ;
Вывод в браузер:
Код:
Array ( [0] => http://top.mail.ru/jump?from=314432 )
Array ( )
Выводы для себя сделай сам. И используй [m]PCRE[/m].
 

Freetz

Guest
lucas
Я совершенно не понял к чему ты это написал. У меня что-то другое.

Вот смотри:
if ( !ereg('fcrubin',"$urls[$i]") ) {
unset($urls[$i]);
}

отцепляет такие урлы:
http://www.gismeteo.ru/etowns/27595.htm
http://spb.kulichki.net/
http://maklen.mi.ru/kazan
Т.е. ТО. что отцепляет - отцепляет верно, по условию.

Но тот же самый
http://top.mail.ru/jump?from=314432
Почему-то оставляет.
 

lucas

Guest
Я совершенно не понял к чему ты это написал. У меня что-то другое.
У тебя -- то же самое.

Запусти мой пример, убедись, что он отрабатывает правильно.
Затем, распечатай ([m]print_r[/m]) массив urls и проконтролируй его значения.

Вообще, прочитай PHP FAQ: Ничего не работает! Что делать???.
 
Сверху