Регулярное выраженее. Помогите найти ошибку.

solaris

Новичок
Регулярное выраженее. Помогите найти ошибку.

Добрый вечер!
Есть задача, найти сылку на заданный домен, определить на кукую страницу эта ссылка ссылается и с каким анкором.
Я совсем плохо еще понимаю регулярные выражения, прочитал много, из всего что понял(скорее всего недопонял), сделал вот такой шаблон:
PHP:
$pattern="/<a([^\>]*)(href\=(\'|\")?)(http\:\/\/)(www\.)?({$link_to})(.*)('|\")?([^\>]*)\>([^<\/a\>]*)<\/a\>/Usmi";
Все работает в принципе нормально, и учитывает всевозможные методы составления ссылки, находит ссылку опредделяет с www она или без, также получает ее анкор, но вот со старницей куда ссылается эта ссылка проблемы:(((
то есть вот в этом месте, послде $link_to(искомого домена):
PHP:
(.*)
сюда сваливается вся часть ссылки от конца имени домена до ">".
пример:
PHP:
$text=<<<END
|<hr>| asdadas dasds <A style='casdas' adsa='asdas' href=\"http://domain.com/bla/bla/bla\" target=\"_blank\">ankor 1,
 ankor 2 </A> asdasdasdasd
END;
$link_to="domain\.com";
$pattern="/<a([^\>]*)(href\=(\'|\")?)(http\:\/\/)(www\.)?({$link_to})(.*)('|\")?([^\>]*)\>([^<\/a\>]*)<\/a\>/Usmi";
preg_match($pattern,$text,$ar);
print_r($ar);
Выводит:
PHP:
Array ( ..... [1] => style='casdas' adsa='asdas' 
[2] => href=" 
[3] => "
 [4] => h t t p : / /
 [5] => 
[6] => domain.com
 [7] =>
 [8] => 
[9] => /bla/bla/bla" target="_blank" 
[10] => ankor 1, ankor 2 )
вторые сутки мучаюсь нкиак не пойму как сделать, что получить еще и страницу домена на которую ссылается ссылка:(

Заранее спасибо.

-~{}~ 30.01.09 23:14:

Короче 4 элемент в массиве просто хттп с двоеточием и слешем,(не знаю как написать, чтоб форум ссылку не вставлял туда)

-~{}~ 31.01.09 12:40:

ну, народ, ну помогите ж, хоть намекните:((( где мне искать помощи как не у вас:(
 

x-yuri

Новичок
а ты сам понимаешь, что ты написал? зачем ты двойные кавычки экранируешь в $text, точку в $link_to, > в классе символов и т.д.?
 

solaris

Новичок
ковычки отэкарнировал в $text, ибо иначче ошибка синтаксиса. На самом деле текст страницы получается через сокет, но вам это код никчему, поэтому заменил его $text.

В $link_to точку экранирую, потому что иначе, она будет воспринята в регулярном выражении как "любой символ".

'>' - тут ступил, действительно не нужно.
переделал так:

PHP:
/<a([^\>]*)(href\=(\'|\")?)(http\:\/\/)(www\.)?({$link_to})(.*)('|\")?([^\>]*)>([^<\/a>]*)<\/a>/Usmi
но эффект тот же.

-~{}~ 31.01.09 13:02:

а понимаю ли я, то как то понимаю, но не факт что правильно. как я понимаю этот шаблон:

<a - так как стоит модификатор i то это может также и <A
([^>]*) - сколько угодно любых символов, за исключением >
(href=('|\")?) - href= - а далее либо одинарная ковычка либо двойная, либо никакой.
(http\:\/\/) --- далее http://
(www\.) ---- www. может быть а может и нет.
({$link_to}) - собственно домен(с экранированной точкой)
(.*) ---- так как стоит модификатор U то любой символ, до первого вхождения следующего выражения.
('|")? -- собственно следующее выражение либо одинарная ковычка либо двойная, либо вообще их нет.
([^\>]*) --- любой символ кроме >
> ---- все понятно.
([^<\/a>]*) ---- любой символ, кроме закрытия тега a
<\/a> ------ закрытие тега А
 

x-yuri

Новичок
теперь избавляемся от экринирования, ведь можем
"#<a([^>]*)(href=('|\")?)(http\://)(www\.)?({$link_to})(.*)('|")?([^\>]*)>([^</a>]*)</a>#Usmi"

теперь: зачем экранируешь двоеточие? и ты пропустил один > ;-)
убери круглые скобки, которые тебе не понадобятся
зачем тебе вообще что-либо после второго ('|") ?
 

solaris

Новичок
# ---- про такой ход увы не знал:(((

Спасибо :)))

сщас еще поиграюсь с выражением используя ваши рекомендации.

-~{}~ 31.01.09 13:16:

зачем тебе вообще что-либо после второго ('|") ?
Ну мне ж нужно получить текст в теге A (анкор ссылки)

Это система мониторинга внешних ссылок на мой сайт, мне важно знать сколько доноров ссылаются на мой сайт и с каими анкорами(текстами ссылок).

-~{}~ 31.01.09 13:19:

x-yuri

PHP:
#<a[^>]*href=('|\")?http://(www\.)?({$link_to})(.*)('|\"|\s)[^\>]*>([^</a>]*)</a>#Usmi
Получилось :)))))

спасибо :)))
 

solaris

Новичок
x-yuri

Хм.. еще красивее, особенно радует кострукция: \1, оказуется можно использовать выражения из самого шаблона:)))
 

x-yuri

Новичок
на самом деле я немного слажал(
нельзя писать "\1\s.*>"
потому что пробел не обязательно будет присутствовать
поэтому прийдется все же вернутся к "('|\"|\s).*>"

-~{}~ 31.01.09 18:52:

хотя тоже не выход. Я бы рассчитывал на то, что ссылки будут в кавычках, т.е.
PHP:
"#<a[^>]*href=('|\")http://(www\.)?({$link_to})(.*)\1.*>(.*)</a>#Usi"
 

Активист

Активист
Команда форума
('|\") не правильно.
Зачем делать маски учитываемым, если они не учитываемые?
href=[\s\'\"]*http://

Если уж и использовать такую вот конструкцию
('|\") - то не учитывать, лишнее. Нужно (?:'|\")
\1 - такие конструкции нужно использовать крайне редко, поскольку это сложные и ресурсоемкие конструкции, для парсинга ссылки - не нужно. Обычно используется для вычисления незвестных совпадений
 
Сверху