Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > регулярка выдаёт ошибку


Автор: darkness 5.8.2006, 12:31
Решил поработать тут с определением ссылок:

вот что получилось:

Код

$href="http://www.net.ru";
$text="хостинг-провайдер";
 
$string="<a href=http://www.net.ru>хостинг-провайдер</a></tr><tr valign= bgcolor=#f0f0f0>";
 
 if (preg_match_all ('<a +(:?href=('.preg_quote($href).'))+ +>('.preg_quote($text).')+</a>', $string, PREG_PATTERN_ORDER))
  {echo"Соответсвия найдены";}
else
  {echo"ничего не найдено";}


А мне в ответ:

Fatal error: Only variables can be passed by reference 

Где закралась трабла?

Автор: Wolf1994 5.8.2006, 12:56
По данной ошибке: на месте PREG_PATTERN_ORDER должна быть переменная для сброса в неё массива совпадений, типа: $out.

Автор: darkness 5.8.2006, 13:18
Wolf1994, ок - СПАСИБО,

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

Warning: preg_match_all(): Unknown modifier '(' 



З.Ы.: кстати регулярка схожа с http://forum.vingrad.ru/index.php?showtopic=103490&hl=

Автор: Wolf1994 5.8.2006, 18:24
Наиболее простое решение для данного случая:
Код

$href="http://www.net.ru";
$text="õîñòèíã-ïðîâàéäåð";

$str="<a href=http://www.net.ru>õîñòèíã-ïðîâàéäåð</a></tr><tr valign= bgcolor=#f0f0f0>";

preg_match ('!\<a href=("|)'.preg_quote ($href).'("|).*\>'.preg_quote ($text).'\<\/a\>!sUi', $str, $out);
if ($out [0])
  echo"Ñîîòâåòñâèÿ íàéäåíû";
else
 echo"íè÷åãî íå íàéäåíî";

Автор: darkness 6.8.2006, 11:13
Wolf1994, понятно.
 В твоём выражении я не знаком лишь с модификатором U
и ещё "!" - как я понял,  означает начало/конец регулярки?

Автор: Wolf1994 6.8.2006, 12:32
"U" - инвертатор "жадности":
Цитата

U (PCRE_UNGREEDY)
Этот модификатор инвертирует жадность квантификаторов, таким образом они по умолчанию не жадные. Но становятся жадными, если за ними следует символ '?'. Такая возможность не совместима с Perl. Модификатор U также может использоваться внутри шаблона, при помощи '?U' записи. 

То есть, если есть выражение:
begin end end
и захватчик:
begin - end
то по умолчанию произойдёт полный захват:
begin end end
а с инвертатором - до первого совпадения:
begin end

http://ru.php.net/manual/ru/reference.pcre.pattern.modifiers.php
http://ru.php.net/manual/ru/reference.pcre.pattern.syntax.php

Цитата

и ещё "!" - как я понял,  означает начало/конец регулярки?

Да.

Автор: DENNN 6.8.2006, 13:49
Цитата(darkness @  5.8.2006,  12:31 Найти цитируемый пост)
Fatal error: Only variables can be passed by reference 

Мне кажется, ему не нравится, что срока собирается при вызове йункции. Попробуй так
Код

$reg_expr='<a +(:?href=('.preg_quote($href).'))+ +>('.preg_quote($text).')+</a>';
if (preg_match_all ($reg_expr, $string, .....

Автор: Mal Hack 6.8.2006, 14:29
А зачем тут _all? если есть однот совпрадение то уже замечательно. Так что preg_match
И потом, зачем тут вообще регулярка, когда через strstr или strpos намного быстрее будет.

Автор: darkness 6.8.2006, 18:35
Цитата(DENNN @ 6.8.2006,  13:49)
Мне кажется, ему не нравится, что срока собирается при вызове йункции. Попробуй так
Код

$reg_expr='<a +(:?href=('.preg_quote($href).'))+ +>('.preg_quote($text).')+</a>';
if (preg_match_all ($reg_expr, $string, .....

Думаю не в этом была проблема, поставил обратные слэши перед >\\ и им подобным - ругаться перестал.....


Mal Hack, сравнение строк я могу smile , а вот с регулярками затрудняюсь, поэтому и выбрал их, а  Wolf1994 вообще Респект smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)