Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > замена с регулярными выражениями preg_replace()


Автор: Solid 3.11.2003, 19:57
Есть маленькая, и в то же время, на первый взгляд, не разрешимая проблемка. Всё дело в регулярном выражении, а именно c функцией preg_replace()... Так что зарание прошу тех, кто плохо разбирается в регулярках, ничего не говорить, или советовать.

Есть данные, вида:

Код
|03.11.02| <me> У меня есть предположение что это так называемый <текст> несколько не относится сюда
|03.11.03| <you> этот такой же, но он менее идееспособный.


Например, запишем эти данные в переменную $string;
Нужно обработать эту переменную при помощи регулярного выражения, что бы в последствие данные имели вид:

Код
|03.11.02| <font color=blue>me</font> У меня есть предположение что это так называемый <текст> несколько не относится сюда
|03.11.03| <font color=blue>you</font> этот такой же, но он менее идееспособный, <а это баг>


На это дело я сочинил следующий код:

Код
$string = preg_replace("/(^\|[0-9]{2}\.[0-9]{2}\.[0-9]{2}\|)[[:space:]]\<(.*)\>[[:space:]](.*$)/m", " <font color=blue></font> ", $string);


и, к моему большому сожалению, в нём есть один баг. Видете в первой строчке me, да? и в конце стоит <текст>, так вот, реплэйс почему-то происходит до последней ">", а не до самой первой.

В общем есть вопрос, как сделать так, что бы было правильно, как я описал?

%)

Автор: Secandr 3.11.2003, 21:35
А если поставить не .* а [^\<]*
и всё получится smile.gif
P.S. Жадность алгоритма.
P.P.S. Правда может \ ненужен

Автор: Solid 3.11.2003, 23:28
Secandr:
Большое спасибо.

Здесь всё конечно правильно, но у меня возникла ещё одна подковырка. В ХТМЛ символ "<" обозначается как "&lt;". Значит мне нужно вставить не [^\<], а "&lt;", но если вставить [^\&lt\;] то получится, что мы будем проверять каждый символ, и если например между <> будет отдельный &, l, t или ;, то, само собой, регулярное выражение нефига не заменит.

Вопрос: как сделать регулярное выражение целостным? Из вышеобъяснённого всё должно быть понятно, вроде.

Автор: Secandr 4.11.2003, 08:08
попробуй [^(\&lt\;)]
Правда я такого не делал.

Автор: Solid 4.11.2003, 18:54
Пожалуйста удалите две предыдущущие записи.

Secandr: хехе, у меня идентичное мышление с тобой. Я точно так же попробовал, но вот не сработало. Это абсолютно некакой разницы не имеет с тем, что я предлагал в предыдущем посте.

Может быть всётаки есть какие-нибудь другие версии? Я даже не поленюсь их опробовать.

Автор: Secandr 5.11.2003, 08:31
Есть бредовое предложение: поменять все "&lt;" обратно на "<" smile.gif

А потом вернуть "&lt;" smile.gif
Хотя это должно работать по другому.

Автор: Solid 7.11.2003, 00:50
Secandr: насамом деле бредовое. Мне бы что попроще ;)

Автор: Solid 7.11.2003, 00:50
OFFTOPIC: сделайте удаление собственных сообщений в форуме, а так же удалите 2 предыдущих (гостевых) сообщения.

Автор: Secandr 7.11.2003, 15:55
Solid Идея, то бредовая, но иногда прокатывает.
У меня почемуто .* иногда не работает, так приходится делать [^\r]* smile.gifsmile.gifsmile.gif

Есть тут люди знающие регулярные выраженияconfused.gif??

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