![]() |
|
![]() |
#1 |
Камрад
Темная личность 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"... ![]() |
![]() |
Дневник [Ответить с цитированием] |
![]() |
#2 |
Join Date: сен 2001
Location: Воронеж
Posts: 2,162
|
Dark
А разве эта грамматика регулярная? Уж больно напоминает классический пример про баланс скобок. В любом случае у тебя всю малину портит (.*) |
![]() |
[Ответить с цитированием] |
![]() |
#3 |
Камрад
Темная личность Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
|
Anafay
А чем ты предлагаешь заменить это выражение? Системой "(.+)" ? ![]() К тому почему-то данные методы везде описываются как пример регулярных выражений... |
![]() |
Дневник [Ответить с цитированием] |
![]() |
#4 |
Join Date: сен 2001
Location: Воронеж
Posts: 2,162
|
Dark
Вопрос: что делать в случае вложенных пар [ b ] [ / b ]? Если вложенность допускается - то грамматика нерегулярная. P.S. Сначала надо представить, что требуется, и после этого уже решать. |
![]() |
[Ответить с цитированием] |
![]() |
#5 |
Камрад
Темная личность Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
|
Anafay
Ты видел в моём примере между тэгов [ b ] и [ /b ] вложенную пару таких же тэгов с той же последовательностью? Я не заметил... А то, что мне требуется, это и так понятно: попарная замена форумных тэгов на html тэги жирного шрифта, как это реализовано здесь и ещё на тысячах форумов инета... |
![]() |
Дневник [Ответить с цитированием] |
![]() |
#6 |
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, если он у тебя поддерживается. То есть заменить ".*" на ".*?" , дабы получать не самый длинный результат, а самый короткий. |
![]() |
[Ответить с цитированием] |
![]() |
#7 |
Камрад
Темная личность Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
|
> Гениально.
- А то! ![]() Я уже глянул в YaBB... Там такой же вариант с вопросительным знаком - как раз то, что надо! |
![]() |
Дневник [Ответить с цитированием] |
![]() |
#8 |
Камрад
Темная личность Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
|
Хм... [^abc] - эта вот фиговина
![]() |
![]() |
Дневник [Ответить с цитированием] |
![]() |
#9 |
Камрад
Join Date: авг 2002
Posts: 1
|
Я сделал так:
$print=текст поста $print =~ s/\[b\](.*?)\[\/b\]/<b>$1<\/b>/isg; |
![]() |
[Ответить с цитированием] |
![]() |
#10 |
Камрад
Темная личность Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
|
dan3k
Речь о PHP. ![]() |
![]() |
Дневник [Ответить с цитированием] |
![]() |
#11 |
Камрад
Join Date: авг 2002
Posts: 1
|
lol
У меня "регулярные выражения" ассоциируются с перлом ![]() |
![]() |
[Ответить с цитированием] |
![]() |
#12 |
Модератор
Злыдень немрущий Join Date: сен 2000
Location: Краснодар
Posts: 2,333
|
Dark
это "жадность" (имхо модификатор /.../U). Пиши так Code:
preg_replace("/\[b\](.*?)\[\/b\]/i", "<b>\\1</b>", $text); |
![]() |
Дневник [Ответить с цитированием] |
![]() |
#13 |
Камрад
Темная личность Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
|
> это "жадность" (имхо модификатор /.../U)
- Это к чему? > не используй eregi_replace без крайней надобности - Похоже даже в крайней необходимости его использовать бесполезно. ЗЫЖ Так как на счёт игнорирования слов aka символов, идущих подряд? |
![]() |
Дневник [Ответить с цитированием] |
![]() |
#14 |
Модератор
Злыдень немрущий Join Date: сен 2000
Location: Краснодар
Posts: 2,333
|
> это "жадность" (имхо модификатор /.../U)
- Это к чему? PCRE_UNGREEDY ("жадность") т.е. берётся максимум из найденного. Мля, не знаю как объяснить... почитай в мануале. > не используй eregi_replace без крайней надобности - Похоже даже в крайней необходимости его использовать бесполезно. я ereg'ообразные вообще не использую >Так как на счёт игнорирования слов aka символов, идущих подряд? т.е.? ты имеешь в виду как :}}}} заменить на :} ? хомсайт+апач влом запускать, но имхо так: preg_replace("/:+}+/",":}", "уряя :::}}}}") |
![]() |
Дневник [Ответить с цитированием] |
![]() |
#15 |
Join Date: сен 2001
Location: Воронеж
Posts: 2,162
|
Dark
А если самым тупым и доступным способом? [^a]|a[^b]|ab[^c] |
![]() |
[Ответить с цитированием] |
![]() |
#16 |
Камрад
Темная личность Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
|
Mips
Ну вот самый простой примерчик: [ b ]Интернет[ /b ] конференция [ b ]Kamrad[ /b ] ru. Так вот, надо чтобы любые слова между [ b ] и [ /b ] выделялись жирным шрифтом, кроме слова "Kamrad". Anafay Мысль интересная... Посмотрим. |
![]() |
Дневник [Ответить с цитированием] |
![]() |
#17 |
Модератор
Злыдень немрущий 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. |
![]() |
Дневник [Ответить с цитированием] |
![]() |
#18 |
Камрад
Темная личность Join Date: авг 2000
Location: Северная столица aka Санкт - Петербург
Posts: 1,422
|
Самой простой вариант (хотя и самый громоздкий).
![]() |
![]() |
Дневник [Ответить с цитированием] |
![]() |
|
|