Регулярка поиска ссылок с заданным доменом

S
На сайте с 05.04.2007
Offline
19
924

Нужна регулярка поиска ссылок, ведущих на определенный домен (например на site.ru). Т.е. из текста

aaa <a href="http://portal.com"> x </a> bbb <a href="http://site.ru"> y </a> ccc

должна выцепиться вторая ссылка (ссылок всего две, первая ведет не на интересующий домен).

При этом у тега "a" допускаются отличные от href атрибуты, которые могут содержать самые разные символы, в том числе "<", ">" (может это и некорректно, но мало кто придерживается стандартов).

По icq знакомый предложил вариант регулярки начинающийся так:


<a[^>]+?href\s*=\s*["']?(https?://(?:www\.)$domain[^'"\s]+)

но она обрубит атрибуты, содержащие ">".

Сам пришел к этому:


<a(.*?)\shref\s*=\s*(["'])(?:https?://(?:www\.)?site\.ru.*?)\2(.*?)</a>

но она на входе:


aaa <a href="http://portal.com"> x </a> bbb <a href="http://site.ru"> y </a> ccc

распознает все после "aaa " и до " ccc", потому что (.*?) в начале ругулярки "съест" все от href'а первой ссылки до href'а второй.

Если за основу брать эту регулярку, то запретив в (.*?) вхождение "href" или "</a>" задача будет решена. При этом как запретить вхождение одного символа понятно ([^some_symbol]*?), а как запретить слово неясно ([^(?:word)]*? - сиволы слова воспринимаются как набор, а не как слово, потому что находятся внутри квадратных скобок).

P.S.: определенные допущения уже имеются в приведенном коде, возможно необходимы еще?

S
На сайте с 13.07.2007
Offline
56
#1
Slogger:
...но она обрубит атрибуты, содержащие ">".

Дык может тогда использовать не одну регулярку, а выцепить сначала все ссылки, а потом на этот массив наложить фильтр?

S
На сайте с 05.04.2007
Offline
19
#2

Такое решение тоже рассматривается.

Но конкретно здесь интересно докопаться до решения на регулярках или понять, что его нет или оно неприемлимо.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий