За последние 24 часа нас посетили 15482 программиста и 1606 роботов. Сейчас ищут 919 программистов ...

Помогите попровить код!Выражение извлекает из html все url

Тема в разделе "Регулярные выражения", создана пользователем pixcher, 9 окт 2009.

  1. pixcher

    pixcher Активный пользователь

    С нами с:
    9 окт 2009
    Сообщения:
    9
    Симпатии:
    0
    PHP:
    1. <?
    2. $html="
    3. <a href='http://www.kuzbass.ru'>olo</a>
    4. <a href=http://www.yandex.ru>olo</a>
    5. <a href=\"http://www.ya.ru\">olo</a>
    6. <a href=google.ru>olo</a>
    7. ";
    8.  
    9.  
    10. preg_match_all("!<a.*?href=\"?'?([^ \"'>]+)([^>]+)>.*?</a>!ism",
    11.     $html, $match);
    12.  
    13. print_r($match[1]);
    14.  
    15. ?>

    Вот код, он выдирает из html все линки, вывод на экран:
    HTML:
    1. Array ( [0] => [url=http://www.kuzbass.ru]http://www.kuzbass.ru[/url] [1] => [url=http://www.yandex.r]http://www.yandex.r[/url] [2] => [url=http://www.ya.ru]http://www.ya.ru[/url] [3] => google.r )
    То есть, если url без кавычек, то выражение обрубает последний символ и выводит www.yandex.r !
    !
     
  2. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    Код (Text):
    1. /<a.*href=(?:'|\")?[^'\">]*(?:'|\")?>.*<\/a>/isU
    не проверял, но может поможет ?
    не понял зачем экранированные кавычки в основном тексте ?
    вроде подобная запись в чистом хтмлье не встречается ?
    но если действительно надо

    Код (Text):
    1. /<a.*href=(?:'|\"|\\\")?[^'\">]*(?:'|\"|\\\")?>.*<\/a>/isU
     
  3. pixcher

    pixcher Активный пользователь

    С нами с:
    9 окт 2009
    Сообщения:
    9
    Симпатии:
    0
    В основном тексте экранированные кавычки только для того, чтобы переменной $html присвоить, иначе ошибка будет, в переменно $html они не экранированны.

    Код (Text):
    1. /<a.*href=(?:'|\"|\\\")?[^'\">]*(?:'|\"|\\\")?>.*<\/a>/isU
    Выдает

    PHP:
    1. (
    2.     [0] => Array
    3.         (
    4.             [0] => <a href='http://www.kuzbass.ru'>olo</a>
    5.             [1] => <a href=http://www.yandex.ru>olo</a>
    6.             [2] => <a href="http://www.ya.ru">olo</a>
    7.             [3] => <a href=google.ru>olo</a>
    8.         )
    9.  
    10. )
    Код (Text):
    1.  
    2.  
    3. А нужно только доменные имена выделить, у меня к сожалению, знаний пока не хватает по регулярным выражениям.
     
  4. pixcher

    pixcher Активный пользователь

    С нами с:
    9 окт 2009
    Сообщения:
    9
    Симпатии:
    0
    нужно в результате в массиве иметь

    Код (Text):
    1. http://www.kuzbass.ru
    2. http://www.yandex.ru
    3. http://www.ya.ru
    4. google.ru
     
  5. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    Код (Text):
    1. /<a.*href=(?:'|\")?([^'\">]*)(?:'|\")?>.*<\/a>/isU
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Код (Text):
    1.  
    2. #<a[^>]+
    3.                    href\s*=\s*(?(?=[\'\"])
    4.                                 ([\'\"])(.+?)\\1
    5.                               |
    6.                                 ([^\s>]+)
    7.                               )
    8.                    [^>]*>#isx
     
  7. Mtnt

    Mtnt Активный пользователь

    С нами с:
    13 май 2009
    Сообщения:
    27
    Симпатии:
    0
    Код (Text):
    1. preg_match_all('/href=("|\')(http:\/\/)?(www\.)?('. SITE_NAME .')?\/[-\w\?\.\/&]*?("|\')/iu',$text,$links,PREG_PATTERN_ORDER);
    вариант рабочий и выдергивает ссылки не только из тегов 'a', а так же из конструкций 'document.location.href="#", но он ограничен конкретным сайтом


    Код (Text):
    1. preg_match_all('/href=("|\')(http:\/\/)?(www\.)?([^\/]*)?\/[-\w\?\.\/&]*?("|\')/iu',$text,$links,PREG_PATTERN_ORDER);
    так должен все сайты ловить
     
  8. pixcher

    pixcher Активный пользователь

    С нами с:
    9 окт 2009
    Сообщения:
    9
    Симпатии:
    0
    Вот рабочий вариант получился, всем спасибо, на всякий случай выкладываю

    PHP:
    1. <?php
    2.  
    3. function clear_array_empty($array)
    4. {
    5.   $ret_arr = array();
    6.   foreach($array as $val)
    7.   {
    8.     if (!empty($val))
    9.     {
    10.       $ret_arr[] = trim($val);
    11.     }
    12.   }
    13.   return $ret_arr;
    14. }
    15.  
    16. $html="
    17. <a href='http://www.kuzbass.ru'>olo</a>
    18. <a href=http://www.yandex.ru>olo</a>
    19. <a href=\"http://www.ya.ru\">olo</a>
    20. <a href=google.ru>olo</a>
    21. ";
    22. $text = $html;
    23.  
    24.  
    25.  
    26. preg_match_all('#<a[^>]+
    27.                   href\s*=\s*(?(?=[\'\"])
    28.                                ([\'\"])(.+?)\\1
    29.                              |
    30.                                ([^\s>]+)
    31.                              )
    32.                   [^>]*>#isx',$text,$links,PREG_PATTERN_ORDER);
    33. $result = array_merge ($links[2], $links[3]);
    34. $result=clear_array_empty(array_unique($result));
    35. print_r($result);
    36.  
    37.  
    38. ?>