PDA

Просмотр полной версии : регулярные выражения


Kadabra
06.07.2005, 21:46
Здравствуйте !

начал изучать регулярные выражения в PHP и столкнулся с такой вот проблеммой:

Допустим есть Html страница. В ней находятся ссылки:
[1]<a href="Htxt1" title="Ttxt1" target="TGtxt1" style=STtxt1>
[2]<a title="Ttxt1" href="Htxt1" target="TGtxt1" style=STtxt1>
[3]<a href="Htxt1" title="Ttxt1" style=STtxt1 target="TGtxt1>
[4]<a target="TGtxt1" href="Htxt1" title="Ttxt1"" style=STtxt1>
[5]<a href="Htxt1">

и есть вот такое рег. выражение "[<a +target=([^>]+) +href=([^>]+) +title=([^>]+) +style=([^>]+)>]",
но оно подойдет только для 4-го варианта, как должно выглядеть выражение, которое позволит вывести информацию о всех выше описанных ссылках ??

конечно есть вариант выбрать сначала строки такого вида <a ...>, а затем по каждому атрибуту :
target=...
href=...
title=...
Но получается, что функция вызывается уже 4 раза :(

Заранее Огромное спасибо !!!

mirian
07.07.2005, 01:45
Если надо только "выдернуть" ссылку то имхо этот паттерн сойдет:

<a.+?href="(.*?)".*?>
в backreference будет ссылка.
Если надо менять ссылки то тогда сойдет вот этот скрипт:

$result = preg_replace('/<a(.+?)href="(.*?)"(.*?)>/', '<a\\1href="some text to replace"\\3>', $subject);
//тоисть тут паттерн будет: <a(.+?)href="(.*?)"(.*?)>

Если новичок в Regex–e советую посетить http://www.regexbuddy.com/
Regexbuddy мне очень помогает в работе, просто великолепная прога.

Constantine
07.07.2005, 10:57
Хорошо, если все урлы в ковычках... ;) Правда, конечная задача в чем, убрать все аттрибуты кроме href?

mirian
07.07.2005, 16:17
Ковычки можно обойти так: "?, тоисть получится:
<a.+?href="?(.*?)"?.*?>

или даже так:["']?
<a.+?href=["']?(.*?)['"]?.*?>
;)

Kadabra
07.07.2005, 22:45
Если надо только "выдернуть" ссылку то имхо этот паттерн сойдет:

<a.+?href="(.*?)".*?>
в backreference будет ссылка.
Если надо менять ссылки то тогда сойдет вот этот скрипт:

$result = preg_replace('/<a(.+?)href="(.*?)"(.*?)>/', '<a\\1href="some text to replace"\\3>', $subject);
//тоисть тут паттерн будет: <a(.+?)href="(.*?)"(.*?)>

Если новичок в Regex–e советую посетить http://www.regexbuddy.com/
Regexbuddy мне очень помогает в работе, просто великолепная прога.

огромное спасибо за ваше внимание !

и еще нашел в инете одно выраженице и переделал под себя :)

"'<a +(.*?) *?>'i
"/href[^=]*=[ \n\r\t]*([^ >\r\n\t#]+)/i"

выдает линки с ковычками конечно, можно сделать и без них, ну я их потом обрезаю обработчиком строк.....

mirian
07.07.2005, 23:22
Всегда рад помочь :)
Вот еще линк в добавок, очень полезная библиотека:
http://www.regexlib.com/