Kamrad.ru

Go Back   Kamrad.ru > Авторские форумы > Веб-дизайн, вёрстка и веб-программирование

Reply
 
Thread Tools Display Modes
Old 19-08-2002, 05:41   #1
Dark
Камрад
Темная личность
 
Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
Задачка на регулярные выражения

Дано:
$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"...
Dark is offline   Дневник [Ответить с цитированием]
Old 20-08-2002, 15:11   #2
Anafay
 
Anafay's Avatar
 
Join Date: сен 2001
Location: Воронеж
Posts: 2,162
Dark
А разве эта грамматика регулярная? Уж больно напоминает классический пример про баланс скобок.

В любом случае у тебя всю малину портит (.*)
Anafay is offline   [Ответить с цитированием]
Old 21-08-2002, 01:32   #3
Dark
Камрад
Темная личность
 
Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
Anafay
А чем ты предлагаешь заменить это выражение? Системой "(.+)" ?
К тому почему-то данные методы везде описываются как пример регулярных выражений...
Dark is offline   Дневник [Ответить с цитированием]
Old 21-08-2002, 11:16   #4
Anafay
 
Anafay's Avatar
 
Join Date: сен 2001
Location: Воронеж
Posts: 2,162
Dark
Вопрос: что делать в случае вложенных пар [ b ] [ / b ]?

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

P.S. Сначала надо представить, что требуется, и после этого уже решать.
Anafay is offline   [Ответить с цитированием]
Old 22-08-2002, 05:21   #5
Dark
Камрад
Темная личность
 
Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
Anafay
Ты видел в моём примере между тэгов [ b ] и [ /b ] вложенную пару таких же тэгов с той же последовательностью? Я не заметил...
А то, что мне требуется, это и так понятно: попарная замена форумных тэгов на html тэги жирного шрифта, как это реализовано здесь и ещё на тысячах форумов инета...
Dark is offline   Дневник [Ответить с цитированием]
Old 22-08-2002, 17:48   #6
Anafay
 
Anafay's Avatar
 
Join Date: сен 2001
Location: Воронеж
Posts: 2,162
Dark
Ты видел в моём примере между тэгов [ b ] и [ /b ] вложенную пару таких же тэгов с той же последовательностью? Я не заметил...

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

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

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

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

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

Вариант 2:
Использовать repetition, если он у тебя поддерживается. То есть заменить ".*" на ".*?" , дабы получать не самый длинный результат, а самый короткий.
Anafay is offline   [Ответить с цитированием]
Old 23-08-2002, 04:56   #7
Dark
Камрад
Темная личность
 
Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
> Гениально.
- А то!

Я уже глянул в YaBB... Там такой же вариант с вопросительным знаком - как раз то, что надо!
Dark is offline   Дневник [Ответить с цитированием]
Old 25-08-2002, 06:54   #8
Dark
Камрад
Темная личность
 
Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
Хм... [^abc] - эта вот фиговина игнориурет один из символов, а как игнорировать не перечисленные символы, а какое-то выражение? С [^(abc)] номер не прошёл.
Dark is offline   Дневник [Ответить с цитированием]
Old 26-08-2002, 02:27   #9
dan3k
Камрад
 
Join Date: авг 2002
Posts: 1
Я сделал так:
$print=текст поста
$print =~ s/\[b\](.*?)\[\/b\]/<b>$1<\/b>/isg;
dan3k is offline   [Ответить с цитированием]
Old 26-08-2002, 06:17   #10
Dark
Камрад
Темная личность
 
Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
dan3k
Речь о PHP.
Dark is offline   Дневник [Ответить с цитированием]
Old 26-08-2002, 12:17   #11
dan3k
Камрад
 
Join Date: авг 2002
Posts: 1
lol
У меня "регулярные выражения" ассоциируются с перлом
dan3k is offline   [Ответить с цитированием]
Old 28-08-2002, 03:17   #12
Mips
Модератор
Злыдень немрущий
 
Mips's Avatar
 
Join Date: сен 2000
Location: Краснодар
Posts: 2,333
Dark
это "жадность" (имхо модификатор /.../U). Пиши так
Code:
preg_replace("/\[b\](.*?)\[\/b\]/i", "<b>\\1</b>", $text);
не используй eregi_replace без крайней надобности, он сильно тормозит.
Mips is offline   Дневник [Ответить с цитированием]
Old 28-08-2002, 05:35   #13
Dark
Камрад
Темная личность
 
Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
> это "жадность" (имхо модификатор /.../U)
- Это к чему?

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

ЗЫЖ Так как на счёт игнорирования слов aka символов, идущих подряд?
Dark is offline   Дневник [Ответить с цитированием]
Old 29-08-2002, 12:30   #14
Mips
Модератор
Злыдень немрущий
 
Mips's Avatar
 
Join Date: сен 2000
Location: Краснодар
Posts: 2,333
> это "жадность" (имхо модификатор /.../U)
- Это к чему?

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

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

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

>Так как на счёт игнорирования слов aka символов, идущих подряд?
т.е.? ты имеешь в виду как :}}}} заменить на :} ?
хомсайт+апач влом запускать, но имхо так: preg_replace("/:+}+/",":}", "уряя :::}}}}")
Mips is offline   Дневник [Ответить с цитированием]
Old 29-08-2002, 14:00   #15
Anafay
 
Anafay's Avatar
 
Join Date: сен 2001
Location: Воронеж
Posts: 2,162
Dark
А если самым тупым и доступным способом?

[^a]|a[^b]|ab[^c]
Anafay is offline   [Ответить с цитированием]
Old 30-08-2002, 05:53   #16
Dark
Камрад
Темная личность
 
Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
Mips
Ну вот самый простой примерчик:

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

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

Anafay
Мысль интересная... Посмотрим.
Dark is offline   Дневник [Ответить с цитированием]
Old 02-09-2002, 09:35   #17
Mips
Модератор
Злыдень немрущий
 
Mips's Avatar
 
Join Date: сен 2000
Location: Краснодар
Posts: 2,333
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;
Особо думать не хочется, посему большой код. Можно создать функцию на выходе и обработать там всё, что хочется.

Last edited by Mips; 02-09-2002 at 09:47.
Mips is offline   Дневник [Ответить с цитированием]
Old 03-09-2002, 04:47   #18
Dark
Камрад
Темная личность
 
Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
Самой простой вариант (хотя и самый громоздкий).
Dark is offline   Дневник [Ответить с цитированием]
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +3. The time now is 09:03.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.
Любое использование материалов сайта
возможно только с разрешения его администрации.