Найти все ссылки кроме..

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

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

    serrgo

    Регистр.:
    13 авг 2006
    Сообщения:
    158
    Симпатии:
    77
    Есть вот такая простенькая регулярка
    которая ищет в тексте все ссылки. Подскажите пожалуйста как дописать ее, чтобы она находила все ссылки, кроме тех где есть вхождения урлов abcd.com,qwerty.com,poiuy.com . Спасибо большое за помощь комрады. Сколько искал, гуглил, спрашивал все бестолку
     
  2. pori

    pori Постоялец

    Регистр.:
    30 авг 2009
    Сообщения:
    114
    Симпатии:
    18
    Раз никто не знает как, рискну предложить:

    PHP:
    $text '
    href="1dfsafdfsaf.ru"
    href="2dfsafdfsaf.ru"
    href="3dfsafdfsaf.ru"
    href="abcd.com"
    href="5dfsafdfsaf.ru"
    href="6dfsafdfsaf.ru"
    href="qwerty.com"
    href="8dfsafdfsaf.ru"
    href="poiuy.com"
    '
    ;

    $regex "'href=\"(.*?)\"'";
    preg_match_all($regex$text$out);
    foreach (
    $out[1] as $i) {
        if (
    strpos($i"abcd.com") === FALSE && strpos($i"qwerty.com") === FALSE && strpos($i"poiuy.com") === FALSE)
            
    $url[] = $i;
    }
    print_r($url);
     
    serrgo нравится это.
  3. serrgo

    serrgo

    Регистр.:
    13 авг 2006
    Сообщения:
    158
    Симпатии:
    77
    Спасибо за помощь, но я просил регулярку а не пхп код). Кто может помочь в составлении регулярки отпишитесь плиз;)
     
  4. antn

    antn Постоялец

    Регистр.:
    11 июл 2009
    Сообщения:
    104
    Симпатии:
    30
    PHP:
    $regex '~<a\\b[^>]+\\bhref\\s*=\\s*(["\'])(https?://(?!(?:[^./]+\\.)*(?:abcd\\.com|qwerty\\.com|poiuy\\.com)(?=/|\\1)).*?)\\1~';
     
    serrgo нравится это.
  5. serrgo

    serrgo

    Регистр.:
    13 авг 2006
    Сообщения:
    158
    Симпатии:
    77
    Спасибо большое за помощь) Только маленькая траббла-в regexbuddy эта регулярка не работает. Просто скажите пожалуйста как делать исключения целых слов из поиска, разбирая регулярку на составные части я так и не поял принципа:( Еще раз спасибо
     
  6. antn

    antn Постоялец

    Регистр.:
    11 июл 2009
    Сообщения:
    104
    Симпатии:
    30
    Для RegexBuddy:
    Код:
    <a\b[^>]+\bhref\s*=\s*(["'])(https?://(?!(?:[^./]+\.)*(?:abcd\.com|qwerty\.com|poiuy\.com)(?=/|\1)).*?)\1
     
    serrgo нравится это.
  7. serrgo

    serrgo

    Регистр.:
    13 авг 2006
    Сообщения:
    158
    Симпатии:
    77
    Все работает, буду разбератся, спасибо
     
  8. antn

    antn Постоялец

    Регистр.:
    11 июл 2009
    Сообщения:
    104
    Симпатии:
    30
    Немного пояснений:
    <a - начало тега ссылки
    \b - в этом месте находится граница слова (чтобы не было совпадения, например, с тегом address)
    [^>]+ - произвольное количество любых символов, кроме символа ">"
    \b - граница слова
    href - без комментариев
    \s* - любое число пробелов, либо их отсутствие
    = - без комментариев
    \s* - любое число пробелов, либо их отсутствие
    (["']) - кавычка, либо " либо ', запоминаем в подмаску #1
    ( - подмаска #2
    https?:// - схема, либо http:// либо https://
    (?! - опережающая негативная проверка, смотрит вперёд и требует чтобы совпадения проверяемой подмаски справа от текущей позиции не было
    (?:[^./]+\.)* - поддомены любого уровня
    (?:abcd\.com|qwerty\.com|poiuy\.com) - перечислены запрещённые домены
    (?=/|\1) - опережающая позитивная проверка, требует, чтобы
    впереди был либо слешь, либо кавычка сохранённая в подмаске #1
    проверка нужна, чтобы не получить совпадение, например, с доменом poiuy.comix
    )
    .*? - здесь читается сама ссылка до первой кавычки
    )
    \1 - здесь должна совпасть закрывающая кавычка сохранённая в подмаске #1
     
    serrgo нравится это.
  9. serrgo

    serrgo

    Регистр.:
    13 авг 2006
    Сообщения:
    158
    Симпатии:
    77
    Респект за проделанную работу, вы очень помогли. Все написано максимально доходчиво. Вы просто ас в регулярках по всей видимости:) Я без RegexBuddy пока не могу написать что то серьезное, но уже выработался кое какой опыт. Да простят меня модераторы за неочень информативное сообщение, просто захотелось выразить благодарность
     
Статус темы:
Закрыта.