Вытащить все внешние ссылки с сайта

Статус
В этой теме нельзя размещать новые ответы.
Подскажите как реализовать что бы внутрение ссылки выдирать

PHP:
// получение всех внутренных ссылок сайта 
function get_internal_links($array){  
    $result = array();  
    $count = count($array);  
        for($i=0;$i<$count;$i++){  
            if(!empty($array[$i])){         
                if(strpos($array[$i],"www",0) === false){  
                    if(strpos($array[$i],"http",0) === false){                     
                        array_push($result,$array[$i]);  
                    }  
                }  
            }  
        }  
    return $result;  
}
 
Подскажите как реализовать что бы внутрение ссылки выдирать
Вот так, по строгому, теги только <a>
Код:
<a\b
(?>\s*[a-z]+\s*=\s*(?:"[^"]*"|'[^']*'|[^"'<>\s]+))*?
\s*href\s*=\s*(?|
     "
       (http://(www\.)?somesite\.ru(?:[?/][^"]*)?|
       (?!https?://|ftp://|mailto:)[^"]+
       )
     "|
     '
       (http://(www\.)?somesite\.ru(?:[?/][^']*)?|
       (?!https?://|ftp://|mailto:)[^']+
       )
     '|
       (http://(www\.)?somesite\.ru(?:[?/][^'"\s<>]*)?|
       (?!https?://|ftp://|mailto:)[^'"\s<>]+
       )(?=[\s>])
)
(?>\s*[a-z]+\s*=\s*(?:"[^"]*"|'[^']*'|[^"'<>\s]+))*\s*>
.*?</a\s*>
 
о_О это регулярное выражение, или LISP? :-D
 
кавычки учесть вот так можно
PHP:
preg_match_all('/<a.*?href=[\'|\"]{0,1}(http:\/\/(?:www\.)?(?!' . $host . ').+?)[\'|\"]{0,1}/is', $this->page_content, $this->links_ext);

a.*?href поменять на a[^>]+href

а pohohref - это слишком ихмо....:)


yandex.ru
[1] => Array
(
[0] => Для просмотра ссылки Войди или Зарегистрируйся
[1] => Для просмотра ссылки Войди или Зарегистрируйся
[2] => Для просмотра ссылки Войди или Зарегистрируйся
[3] => Для просмотра ссылки Войди или Зарегистрируйся
[4] => Для просмотра ссылки Войди или Зарегистрируйся
и тд

не корректно работает, нет ли у кого получше варианта?

тут нашёл
Для просмотра ссылки Войди или Зарегистрируйся
PHP:
preg_match_all("/<[Aa][ \r\n\t]{1}[^>]*[Hh][Rr][Ee][Ff][^=]*=[ '\"\n\r\t]*([^ \"'>\r\n\t#]+)[^>]*>/",$buf,$url);

Вроде получше работает. Подскажите как в него вставить - не искать $host?
$host без http:// и без www.
c www считать один и тем же хостом.
 
А в 12 посте чем не устраивает?
 
Не следует увлекаться регулярными выражениями сверх меры. Гораздо проще другой подход: библиотека парсит HTLM и представляет его в виде дерева. К сожалению не знаю, что есть в PHP мире для этого - давно только python используют. Далее с помощью этой библиотеки запрашиваем все A тэги и анализируем их аргумент href - и всё это понятными конструкциями на языке PHP без десятиэтажных регулярных выражений :)
 
К сожалению обычно такой метод работает гораздо медленней. Хотя если скорость устраивает, вариант самое то.
 
Сейчас как раз занимаюсь вытягиванием ссылок со страницы.

Кто-нибудь может помоч с составлением универсальной регулярки?

Вот что мне нужно:
Получить тело ссылки: <a href="URL" rel="">Anchor</a>
Нужно вытянуть :
  • URL
  • Anchor
  • dofollow ссылка или нет

Буду рад любым ответам, возможно кто-то встречал готовое решение, то что описано выше в этой ветке, по-моему мне не подходит... :nezn:
 
PHP:
<?php
$w='<a href="index.html" rel="index">ancor</a>';
$re='{
<a\b
(?:(?=
  (?>\s*\b[a-z]+(?:\s*=\s*(?:"[^"]*"|\'[^\']*\'|[^<>"\'\s]+))?)*
  \s*\brel\s*=\s*(?|"([^"]*)"|\'([^\']*)\'|([^<>"\'\s]+))
))?
(?>\s*\b[a-z]+(?:\s*=\s*(?:"[^"]*"|\'[^\']*\'|[^<>"\'\s]+))?)*
\s*\bhref\s*=\s*(?|"([^"]*)"|\'([^\']*)\'|([^<>"\'\s]+))
(?>\s*\b[a-z]+(?:\s*=\s*(?:"[^"]*"|\'[^\']*\'|[^<>"\'\s]+))?)*
\s*>
(.*?)
</a\s*>
}xis';
preg_match($re, $w, $m);
print_r($m);
 
Еще вариант

Код:
<a\s*href\s*=\s*(['\"])(.*?)\\2\s*(rel\s*=\s*(['\"])(.*?)\\5)>(.*)<\/a>
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху