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


Автор: -=Ustas=- 9.9.2005, 10:30
Здрасте!
Прошу не ругать, я с ними (регами) еще не очень подружился, вот, пытаюсь.
Значит есть такой дескриптор в переменной:
[ URL=http://\"http://www.site.ru/test_link.html\"]Тестовая ссылка[/URL ]
Заменяю его так:
Код

$text = preg_replace("/ *\[url=\"(.*)\"\](.*)\[\/url\] */i", "<a href=\"\\1\">\\2</a>", $text);

- этот заменяется замечательно. А есть вот такой [img=\"pic\image.gif\"], заменяю его почти идентично, за исключением закрывающего дескриптора:
Код

$text = preg_replace("/ *\[img=\"(.*)\"\] */i", "<img src=\"\\1\">", $text);

Так он, после нахождения первого вхождения загребает в себя весь остальной текст, в том числе и [url=...] и [hr] и вообще всё, что дальше идет, как если бы не стояло в конце закрывающей - ]. Следовательно замена потом не работает.
Если же я инвертирую "жадность" модификатором U, то тогда нормально, но ведь в первом, где [url=]...[/url] без этого модификатора всё нормально пашет. Ничего не понимаю!!! smile Объясните, если это не составит труда.
Заранее пасибки!

Автор: AriX 9.9.2005, 13:54
-=Ustas=-
Не претендую на правильность, но по-моему и первый регэксп у тебя неправильный smile

Щас примерно объясню

Первый регэксп
Код
(.*)\[\/url\]

.* забирает сначала все, потом отдает по одному символу, до того момента, когда совпадет \[\/url\]
Если у тебя в тексте всего одна [ url ], то все будет нормально, если после этого есть еще [ url ], то конечная часть регэкспа (\[\/url\]) совпадет с закрывающимся тегом у второго [ url ]

Второй регэксп
Код
(.*)\"\]

Здесь .* забирет все, до последнего встречающегося в тексте символа ] по принципе описанному выше, т.к. этот кватнификатор "жадный"

Я бы немного изменил оба выражения примерно так
первое:
Код
\[url=\"
([^\"]*)
\"\]
([^\]*])
\[\/url\]

второе
Код
\[img=\"
([^\"]*)
\"\]

(разбил по строчкам для облегчения восприятия)

Вроде должны работать
Или можно использовать "нежадные" кватнификаторы

Автор: -=Ustas=- 9.9.2005, 14:01
Пасибки за пояснение, буду разбираться.

Автор: Mal Hack 9.9.2005, 16:37
-=Ustas=-
тебе надо .*? использовать.
А вообще ты же вроде должен был видеть темы, в которых регулярки для этих вещей уже давались, ты в них сам вроде отмечался даже smile

Автор: -=Ustas=- 9.9.2005, 16:44
Цитата(Mal @ 9.9.2005, 16:37)
-=Ustas=-
А вообще ты же вроде должен был видеть темы, в которых регулярки для этих вещей уже давались, ты в них сам вроде отмечался даже smile

Мне не нужны готовые регулярки. Я просто просто начал учить их по Дж.Фридлу, некоторые вещи я не догнал, поэтому за пояснениями и обратился. smile
AriX, кстати, пробовал по твоему принципу - ничего не понял, и ничего не работает. smile
Добавлено @ 16:47
Mal Hack, чётко подсказал!!! Идеально работает. Пасибки!
Добавлено @ 16:48
А пояснить данную конструкцию не мог бы? Именно эту связку .*? .

Автор: Mal Hack 9.9.2005, 16:54
Цитата
А пояснить данную конструкцию не мог бы? Именно эту связку .*? .

Это так сказать "жадность".
Т.е. .*? - любой символ, пока не встретиться первый ", а .* - любой символ до последнего ". Это на практике так.
Более точно принцип описан тут: http://php.rinet.ru/manual/ru/reference.pcre.pattern.syntax.php
В принципе это лучший хэлп для всего...

Автор: -=Ustas=- 9.9.2005, 19:26
Большое спасибо! В нэте сколько лазил, но на данный ман почему-то не натыкался. smile

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