Kamrad.ru
 
 
дневники | кабинет | регистрация | календарь | участники | faq | правила | поиск | фотоальбом | каська | выйти
Kamrad.ru Kamrad.ru » Авторские форумы » Веб-дизайн, вёрстка и веб-программирование » Задачка на регулярные выражения
новая тема  ответить следующая тема | предыдущая тема
Автор
 
Dark - offline Dark
19-08-2002 02:41 URL сообщения Дневник     K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Камрад
Темная личность



Задачка на регулярные выражения

Дано:
$text="[ b]text1[ /b] text2 [ b]text3[ /b] text4";

Задание:
text1 text2 text3 text4

Решение:
$text = eregi_replace("\[ b\](.*)\[ /b\]", "<b>\\1</b>", $text);

Ответ:
text1[ /b] text2 [ b]text3 text4

Как говориться: "error"...

Anafay - offline Anafay
20-08-2002 12:11 URL сообщения      K-Mail    Профиль    Поиск    Контакт-лист   Редактировать




Dark
А разве эта грамматика регулярная? Уж больно напоминает классический пример про баланс скобок.

В любом случае у тебя всю малину портит (.*)

Dark - offline Dark
20-08-2002 22:32 URL сообщения Дневник     K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Камрад
Темная личность



Anafay
А чем ты предлагаешь заменить это выражение? Системой "(.+)" ?
К тому почему-то данные методы везде описываются как пример регулярных выражений...

Anafay - offline Anafay
21-08-2002 08:16 URL сообщения      K-Mail    Профиль    Поиск    Контакт-лист   Редактировать




Dark
Вопрос: что делать в случае вложенных пар [ b ] [ / b ]?

Если вложенность допускается - то грамматика нерегулярная.

P.S. Сначала надо представить, что требуется, и после этого уже решать.

Dark - offline Dark
22-08-2002 02:21 URL сообщения Дневник     K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Камрад
Темная личность



Anafay
Ты видел в моём примере между тэгов [ b ] и [ /b ] вложенную пару таких же тэгов с той же последовательностью? Я не заметил...
А то, что мне требуется, это и так понятно: попарная замена форумных тэгов на html тэги жирного шрифта, как это реализовано здесь и ещё на тысячах форумов инета...

Anafay - offline Anafay
22-08-2002 14:48 URL сообщения      K-Mail    Профиль    Поиск    Контакт-лист   Редактировать




Dark
Ты видел в моём примере между тэгов [ b ] и [ /b ] вложенную пару таких же тэгов с той же последовательностью? Я не заметил...

Гениально. В общем, замени (.*) на ([^\[])*. С твоим примером работать будет. На практике лучше не используй, ведь в примере окромя [ b ] никаких тегов нет

А то, что мне требуется, это и так понятно: попарная замена форумных тэгов на html тэги жирного шрифта, как это реализовано здесь и ещё на тысячах форумов инета...

Теперь серьезно. Если учесть, что вложения не используются, и в случае некорректно заданных тегов [ b ] / [ / b ] тебе абсолютно без разницы, который из тегов будет заменен на <b>, эта задача решаема двумя способами.

Причина - в твоем примере есть две строки, удовлетворяющие твоему выражению: [ b ]text1[ / b ] и [ b ]text1[ / b ] text2 [ b ]text3[ / b ]. По умолчанию регэксп берет самую длинную из тех, что удовлетворяют твоему условию. А это уже не то, что тебе нужно.

Вариант 1:
Убрать из .* открывающиеся теги [ b ] либо закрывающиеся [ / b ], а, может, и оба сразу.

Вариант 2:
Использовать repetition, если он у тебя поддерживается. То есть заменить ".*" на ".*?" , дабы получать не самый длинный результат, а самый короткий.

Dark - offline Dark
23-08-2002 01:56 URL сообщения Дневник     K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Камрад
Темная личность



> Гениально.
- А то!

Я уже глянул в YaBB... Там такой же вариант с вопросительным знаком - как раз то, что надо!

Dark - offline Dark
25-08-2002 03:54 URL сообщения Дневник     K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Камрад
Темная личность



Хм... [^abc] - эта вот фиговина игнориурет один из символов, а как игнорировать не перечисленные символы, а какое-то выражение? С [^(abc)] номер не прошёл.

dan3k - offline dan3k
25-08-2002 23:27 URL сообщения      K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Камрад



Я сделал так:
$print=текст поста
$print =~ s/\[b\](.*?)\[\/b\]/<b>$1<\/b>/isg;

Dark - offline Dark
26-08-2002 03:17 URL сообщения Дневник     K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Камрад
Темная личность



dan3k
Речь о PHP.

dan3k - offline dan3k
26-08-2002 09:17 URL сообщения      K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Камрад



lol
У меня "регулярные выражения" ассоциируются с перлом

Mips - offline Mips
28-08-2002 00:17 URL сообщения Дневник     K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Модератор
Злыдень немрущий



Dark
это "жадность" (имхо модификатор /.../U). Пиши так

code:
preg_replace("/\[b\](.*?)\[\/b\]/i", "<b>\\1</b>", $text);

не используй eregi_replace без крайней надобности, он сильно тормозит.

Dark - offline Dark
28-08-2002 02:35 URL сообщения Дневник     K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Камрад
Темная личность



> это "жадность" (имхо модификатор /.../U)
- Это к чему?

> не используй eregi_replace без крайней надобности
- Похоже даже в крайней необходимости его использовать бесполезно.

ЗЫЖ Так как на счёт игнорирования слов aka символов, идущих подряд?

Mips - offline Mips
29-08-2002 09:30 URL сообщения Дневник     K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Модератор
Злыдень немрущий



> это "жадность" (имхо модификатор /.../U)
- Это к чему?

PCRE_UNGREEDY ("жадность") т.е. берётся максимум из найденного. Мля, не знаю как объяснить... почитай в мануале.

> не используй eregi_replace без крайней надобности
- Похоже даже в крайней необходимости его использовать бесполезно.

я ereg'ообразные вообще не использую

>Так как на счёт игнорирования слов aka символов, идущих подряд?
т.е.? ты имеешь в виду как :}}}} заменить на :} ?
хомсайт+апач влом запускать, но имхо так: preg_replace("/:+}+/",":}", "уряя :::}}}}")

Anafay - offline Anafay
29-08-2002 11:00 URL сообщения      K-Mail    Профиль    Поиск    Контакт-лист   Редактировать




Dark
А если самым тупым и доступным способом?

[^a]|a[^b]|ab[^c]

Dark - offline Dark
30-08-2002 02:53 URL сообщения Дневник     K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Камрад
Темная личность



Mips
Ну вот самый простой примерчик:

[ b ]Интернет[ /b ] конференция [ b ]Kamrad[ /b ] ru.

Так вот, надо чтобы любые слова между [ b ] и [ /b ] выделялись жирным шрифтом, кроме слова "Kamrad".

Anafay
Мысль интересная... Посмотрим.

Mips - offline Mips
02-09-2002 06:35 URL сообщения Дневник     K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Модератор
Злыдень немрущий



code:

$txt="b text bold text. bold in kaMrad'e Kamrad";
$txt=preg_replace("/(kamrad)/i", "[/b]\\1[b]", $txt);
$txt=preg_replace("/\[b\](.*?)\[\/b\]/i", "<b>\\1</b>", $txt);
$txt=preg_replace("/\[\/b\](kamrad)\[b\]/i", "\\1", $txt);
echo $txt;


Особо думать не хочется, посему большой код. Можно создать функцию на выходе и обработать там всё, что хочется.

Изменено: Mips, 02-09-2002 в 06:47

Dark - offline Dark
03-09-2002 01:47 URL сообщения Дневник     K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Камрад
Темная личность



Самой простой вариант (хотя и самый громоздкий).

Текущее время: 07:19
новая тема  ответить следующая тема | предыдущая тема
 
Перейти:

версия для печати   отправить эту страницу по e-mail   подписаться на эту тему

 
Powered by: vBulletin Version 2.0.1
Copyright ©2000, 2001, Jelsoft Enterprises Limited.
Любое использование материалов сайта
возможно только с разрешения его администрации.


 

Рейтинг@Mail.ru
Рейтинг@Mail.ru