Нужна помощь с регулярками

dmitry

Новичок
Нужна помощь с регулярками

Добрый день, товарищи.

Есть регулярное выражение для поиска в тексте HTML ссылок. На выходе получаем все, ссылки, что есть на странице. Все хорошо ;) только вот проблемма - все не нужны, необходимо найти только одну, текст которой известен.
Я с регулярными работал когда-то давно и практически ничего уже не помню, а чтобы разобраться - очень мало времени. Пожалуйста, посоветуйте, как исправить шаблон, чтобы искал не <a href='ссылка'>, а <a href='ссылка'>текст ссылки

текст ссылки у меня хранится в переменной $text_l, а сам шаблон - вот:

PHP:
preg_match_all("'<\s*a\s.*?href\s*=\s*			     # find <a href=
					([\"\'])?					       # find single or double quote
					(?(1) (.*?)\\1 | ([^\s\>$text_l]+))	# if quote found, match up to next matching
											         # quote, otherwise match up to next space
					'isx",$document,$links);
Заранее всем большое спасибо.
 

dmitry

Новичок
если в приведенном мною выше шаблоне поменять (?(1) (.*?)\\1 | ([^\s\>]+)) на [^>]+>текст ссылки ---- это будет правильным решением?
или же надо заменить только ([^\s\>$text_l]+) ?
 

dmitry

Новичок
Код:
preg_match_all("'<\s*a\s.*?href\s*=\s*		# find <a href=
			([\"\'])?				       # find single or double quote
			(\S*([\"\'])?[^>]+>$word)'isx",$document,$links);
вот к чему я пришел после изучения мануалов и форумов по теме регэкспов, но к сожалению, работать эта конструкция не работает. Кто-то из сведущих, подскажите в чем ошибка?
Повторюсь - необходимо найти URL в конструкции <a href , текст ссылки, которой задан (хранится в переменной $word)
 

hermit_refined

Отшельник
экспериментируйте, вы за это деньги небось получаете.
два замечания по ходу дела: <\s*a - полная чушь, а текст ссылки перед подстановкой в регулярку надо обрабатывать [m]preg_quote[/m].
 

dmitry

Новичок
за квотирование - а спасибо...
а тестинг без хорошего знания "предмета" становится похож на поиск мины сапером на минном поле без всякого оборудования ;) все надежды только на удачу )))

-~{}~ 04.12.06 04:45:

в итоге пришли с товарищем к такому варианту
Код:
$reg="~<\s*a\s*href\s*=\s*(\"|\')?\s*(.+?)\s*(\"|\')?\s*>\s*".$text_l."?<\/a>~isx";
если нужная ссылка стоит первой - все отлично определяет, но если позже - начинается неразбериха...

Код:
<?php

$text_l="…далее…";
$text_l = preg_quote($text_l);
$reg="~<a\s*href\s*=\s*(\"|\')?\s*(.+?)\s*(\"|\')?\s*>\s*".$text_l."?<\/a>~isx"; 

$string="<a href='zapros/zapros_1/zapros548.doc'>jklhjlk</a>Управление по культуре и спорту Администрации Истринского района извещает о продлении срока подачи котировочных заявок по запросу котировок цен на монтаж  кондиционеров  в помещении  центральной  районной взрослой  библиотеки<a href='zapros/zapros_1/zapros548_1.doc'>…далее…</a>
          <li><b>Протокол заседания </b> Котировочной комиссии<a href='zapros/protokol/protokol519.doc'>…далее…</a></li></p>";
if (preg_match($reg,$string,$matches)) echo "da!"; else echo "Net!";
print_r($matches[2]);

?>
это кусок кода, на котором тестировалась данная задача --- вывод следующий:

Код:
da!zapros/zapros_1/zapros548.doc'>jklhjlkУправление по культуре и спорту Администрации Истринского района извещает о продлении срока подачи котировочных заявок по запросу котировок цен на монтаж кондиционеров в помещении центральной районной взрослой библиотеки
Возможно кто-то сталкивался с подобной проблемой или просто появятся какие-то мысли - буду очень благодарен, времени совсем нет. Проект надо было сдавать вчера ;)
 

sage

Новичок
руки тебе и твоему товарищу надо пообрывать за такую регулярку... ты вообще мои посты читаешь?
 

dmitry

Новичок
sage
пробовал вчера то, что ты предложил... почему-то не работало, возможно я пытался засунуть прямым текстом
preg_match("!<a\s*href='([^']+)'[^>]*>$text_l!isx",$document,$links) - причина была в этом, возможно просто что-то с руками... сейчас сделал следующим образом
$text_l = preg_quote($text_l);
$reg="!<a\s*href='([^']+)'[^>]*>".$text_l."!isx";
preg_match($reg,$document,$links);
все отлично работает.
Большое спасибо всем кто помогал, sage отдельное спасибо. В ближайщее время сяду за изучение регулярок - основательно ))))
 
Сверху