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

Статус
В этой теме нельзя размещать новые ответы.

serrgo

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

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);
 
Спасибо за помощь, но я просил регулярку а не пхп код). Кто может помочь в составлении регулярки отпишитесь плиз;)
 
PHP:
$regex = '~<a\\b[^>]+\\bhref\\s*=\\s*(["\'])(https?://(?!(?:[^./]+\\.)*(?:abcd\\.com|qwerty\\.com|poiuy\\.com)(?=/|\\1)).*?)\\1~';
 
Спасибо большое за помощь) Только маленькая траббла-в regexbuddy эта регулярка не работает. Просто скажите пожалуйста как делать исключения целых слов из поиска, разбирая регулярку на составные части я так и не поял принципа:( Еще раз спасибо
 
Для RegexBuddy:
Код:
<a\b[^>]+\bhref\s*=\s*(["'])(https?://(?!(?:[^./]+\.)*(?:abcd\.com|qwerty\.com|poiuy\.com)(?=/|\1)).*?)\1
 
Все работает, буду разбератся, спасибо
 
Немного пояснений:
<a - начало тега ссылки
\b - в этом месте находится граница слова (чтобы не было совпадения, например, с тегом address)
[^>]+ - произвольное количество любых символов, кроме символа ">"
\b - граница слова
href - без комментариев
\s* - любое число пробелов, либо их отсутствие
= - без комментариев
\s* - любое число пробелов, либо их отсутствие
(["']) - кавычка, либо " либо ', запоминаем в подмаску #1
( - подмаска #2
https?:// - схема, либо http:// либо https://
(?! - опережающая негативная проверка, смотрит вперёд и требует чтобы совпадения проверяемой подмаски справа от текущей позиции не было
(?:[^./]+\.)* - поддомены любого уровня
(?:abcd\.com|qwerty\.com|poiuy\.com) - перечислены запрещённые домены
(?=/|\1) - опережающая позитивная проверка, требует, чтобы
впереди был либо слешь, либо кавычка сохранённая в подмаске #1
проверка нужна, чтобы не получить совпадение, например, с доменом poiuy.comix
)
.*? - здесь читается сама ссылка до первой кавычки
)
\1 - здесь должна совпасть закрывающая кавычка сохранённая в подмаске #1
 
Респект за проделанную работу, вы очень помогли. Все написано максимально доходчиво. Вы просто ас в регулярках по всей видимости:) Я без RegexBuddy пока не могу написать что то серьезное, но уже выработался кое какой опыт. Да простят меня модераторы за неочень информативное сообщение, просто захотелось выразить благодарность
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху