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

Тема в разделе "Регулярные выражения", создана пользователем HatoL, 4 ноя 2008.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. HatoL

    HatoL

    Регистр.:
    5 фев 2008
    Сообщения:
    206
    Симпатии:
    36
    Есть следующий кусок кода (на PHP:(
    PHP:
    $host str_replace('.''\.'$this->url_host_simple);
    $this->links_ext_num preg_match_all('/<a.*?href="(http:\/\/(?:www\.)?(?!' $host ').+?)"/i'$this->page_content$this->links_ext);
    Все работает почти безупречно. Но в результат попадают также внутренние ссылки ресурса, начинающиеся на "www.". Например "http://site.ru/" не попадет в результат, а "http://www.site.ru/" - да. Переменная $this->url_host_simple содержит адрес хоста без префикса "www." в начале. Всю голову переломал, тысячу раз разбирал заново регу, но вижу, что все должно работать! На вас последняя надежда, nulled.ws.
     
  2. unsiker

    unsiker

    Регистр.:
    6 июн 2008
    Сообщения:
    465
    Симпатии:
    172
    Нужно проверку делать
    через strpos.
    логика проста до ужаса, если нашло подстроку в строке, то это внутреняя ссылка, а если не нашло то это внешняя

    http://ru2.php.net/manual/ru/function.strpos.php
     
  3. HatoL

    HatoL

    Регистр.:
    5 фев 2008
    Сообщения:
    206
    Симпатии:
    36
    думаешь один такой умный? Мне нужно решение именно регулярным выражением.
     
  4. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Просто поправить- ...(?:www\.)?+(?!' . $host...
    А вообще регулярка аццтой, я бы подругому написал.
     
  5. HatoL

    HatoL

    Регистр.:
    5 фев 2008
    Сообщения:
    206
    Симпатии:
    36
    готов поспорить. В каком месте она "аццтой" ?
     
  6. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Например, с такой строкой совпадет
    HTML:
    
    <a href="http://site.ru/ht">ссылка1</a> pohohref="http://notsite.ru/"
    
    Ибо <a.*?href
    Не говоря уже о том что не учитывается возможность кавычек '...' пробелов между =, и тем более то что некоторые вообще кавычек не ставят.
     
  7. serg_g

    serg_g Создатель

    Регистр.:
    31 окт 2008
    Сообщения:
    35
    Симпатии:
    9
    кавычки учесть вот так можно
    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 - это слишком ихмо....:)
     
  8. ewg777

    ewg777

    Регистр.:
    6 авг 2007
    Сообщения:
    763
    Симпатии:
    321
    Попробуйте это ;)
    PHP:
    // получение всех внешних ссылок сайта 
    function get_external_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;  
    }  
     
  9. HatoL

    HatoL

    Регистр.:
    5 фев 2008
    Сообщения:
    206
    Симпатии:
    36
    я уже давно все сделал :)
    вместо [\'|\"] имхо лучше написать [\"\'] - так будет меньше нагрузки на парсер Perl-регулярных выражений (на официальном сайте так написано). Остальную часть реги не смотрел
     
  10. index111

    index111

    Регистр.:
    21 окт 2007
    Сообщения:
    533
    Симпатии:
    77
    Подскажите как реализовать что бы внутрение ссылки выдирать
     
Статус темы:
Закрыта.