Получить все ссылки со страницы

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

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

    Stripe

    Регистр.:
    21 окт 2007
    Сообщения:
    164
    Симпатии:
    9
    Как должна выглядеть регулярка, получающая все ссылки со страницы?
     
  2. Stripe

    Stripe

    Регистр.:
    21 окт 2007
    Сообщения:
    164
    Симпатии:
    9
    Решение:
    PHP:
    # Пример в PHP

    $text '<a href="http://site1.ru">Site 1</a> Any text <a href="http://site2.ru">Site 2</a>';

    $out = array();
    preg_match_all('|<a.* href=(.*)>(.*)</a>|U'$text$out);

    # $out будет содержать массив данных
    Перейти по ссылке
     
    XUC нравится это.
  3. Matinier

    Matinier Постоялец

    Регистр.:
    5 окт 2009
    Сообщения:
    65
    Симпатии:
    4
    Есть небольшой нюанс в указанной регулярке: она вырежет не только ссылки типа Перейти по ссылке, но и "якоря", например такие:

    HTML:
    
    <a name="anchor">Point</a>
    Any text
    Any text
    Any text
    <a href="#anchor">Point</a>
    
    а подобные ссылки зачастую не нужны.
    Поэтому я бы модифицировал вышеописанную регулярку:

    PHP:
    preg_match_all('|<a.* href=(.http.*)>(.*)</a>|U'$text$out); 

    # $out будет содержать массив данных
     
    XUC и Stripe нравится это.
  4. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    363
    Симпатии:
    117
    а если таким:
    Код:
    @"(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&amp;%\$#_]*)?" 
     
    XUC и Stripe нравится это.
  5. exGumator

    exGumator Создатель

    Регистр.:
    11 окт 2009
    Сообщения:
    10
    Симпатии:
    3
    жадность регулярок

    я полдня протрахался у меня скрипт хавал парашу пока не заменил

    .* на [^>]* то есть, что не дает выйти за пределы тега,
    начал юзать прогу которую поставил год назад :D RegexBuddy3
     
    XUC нравится это.
  6. sekaiyume

    sekaiyume Создатель

    Регистр.:
    28 ноя 2009
    Сообщения:
    11
    Симпатии:
    2
    Вы можете использовать это:
    PHP:
    preg_match_all('@<a(?:.*)href=[\'"]([^"\']*)[\'"](?:[^>])>@i'$text$matches);
    и их использование массив $ Matches
     
    XUC нравится это.
  7. rakita13

    rakita13 Прохожие

    Пара прямых рук заменит подобный софт.:-]
    PHP:
    preg_match_all("/<a.*href=['\"]([^\"']+).*>([</a]*)/isU"$text$matches);
    так уже было?:)
     
  8. fangete

    fangete Постоялец

    Регистр.:
    2 ноя 2007
    Сообщения:
    144
    Симпатии:
    124
    ([</a]*) - заэкранировать "/" нужно :)
     
  9. Matinier

    Matinier Постоялец

    Регистр.:
    5 окт 2009
    Сообщения:
    65
    Симпатии:
    4
    Ничего экранировать не надо ни в коем случае! То, что стоит в квадратных скобках - группа символов, их экранировать не надо.
    То есть там перечислены символы, которые могут встретиться 0 и более раз, но никакие другие символы, кроме перечисленных в [] учитываться не будут.
    В [] можно писать любые символы и они будут рассматриваться регуляркой без всякого экранирования.
     
  10. N()fix

    N()fix Создатель

    Регистр.:
    24 ноя 2008
    Сообщения:
    17
    Симпатии:
    5
    Ну не совсем любые, надо экранировать «]», «-» и что касается PHP, надо экранировать ограничивающий символ (даже в []).
    И конкретно в выражении:
    надо писать [<\/a]
    либо изменить ограничитель, например на «%»:
    PHP:
    '%<a.*href=[\'"]([^"\']+).*>([</a]*)%isU'
     
    XUC нравится это.
Статус темы:
Закрыта.