Автор оригинала: freeek
ну это только кажется что такая
1) для начала надо определиться что мы будем искать
ты хочешь
я предлагаю работать только с
2) так как ссылок в тексте может быть много, надо сделать регу нежадной U, так есть переносы s и i для регистронезависимого поиска
3) по сути начало тега можно представить в виде
, т.е. открывающий тег, все что угодно кроме закрывающего и сам закрывающий
4) потом эту конструкцию расширяем, так как нам интересен href его и ищем в первую очередь, что то типа:
5) на нужно значение href, поэтому в этом шаге мы ищем его:
PHP:
'<a.*href=(?:\'|\")(.*)(?:\'|\")[^>]*>%iUs'
. мы использовали
вместо символьного класса
, так как это уместней,
чтобы не захватывало подмаску
6) смотрим на сам урл, ну тут уже все персонально, главная мысль используем http\:\/\/ для индетефикации (в общем виде, может и не быть если ссылка относительная и т.д.):
PHP:
'%<a.*href=(?:\'|\")http\:\/\/(.*)(?:\'|\")[^>]*>%iUs'
7) а теперь выбираем тот который нам подходит, в данном случае, если нам надо выбрать все урлы, доменные имена которых не равны
www.url.com, пишем
PHP:
'%<a.*href=(?:\'|\")http\:\/\/(?!www\.url\.com)(.*)(?:'|\")[^>]*>%iUs'
,
- отрицательное утверждение после позиции
, смысл его в том что,- мы вибераем все значения гссылок в которых доменными именами не может быть
, ну или просто все анкоры в которых после
не следует
, а дальше описывем ссылку как
ну или как я предложил ранее в виде символьного класса
, это для того чтобы отделить доменные имя
1) ты хочешь схватить сразу весь тег с содержимым
2) вместо отрицательного утверждения после
http:// или '," неважно, ты использовал символьный класс, которй можно описать как любые символы кроме те [^www\.url\.ru], это можно записать проще как [^wurl\.] - понятно, что это и не пахнет www\.url\.ru
эти два момента, первый в меньшей степени (потому как это можно представить и ввиде
PHP:
'%<a.*href=(?:\'|\")http\:\/\/(?!www\.url\.ru).*(?:\'|\").*(?=a>)a>%iUs'
), а в основном второй, который и есть ошибкойв данном случае