
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.217.2] |
![]() |
|
Сообщ.
#1
,
|
|
|
Как вы заметили у нас в форуме тег CODE вставляется так:
(например) [ CODE=pas ] ** [/CODE] Юзер вставляет курсор в пустую строку ** и добавляет туда текст, получается вот чего: [ CODE=pas ] (лишний \n) MySuperProgram1 MySuperProgram2 (лишний \n) [/CODE] и так программа из-за этого выглядит так: ![]() ![]() MySuperProgram1 MySuperProgram2 Как бы убрать эти лишние \n если они есть при сохранении поста так: [ CODE=pas ]MySuperProgram1 MySuperProgram2[/CODE] и тогда тег CODE будет выглядеть так красиво: ![]() ![]() MySuperProgram1 MySuperProgram2 Короче нужно регулярное выражение. Также нужно учесть что code может быть без указания синтаксиса, просто [ code ] .. [ /code ] |
Сообщ.
#2
,
|
|
|
![]() ![]() $data = <<<DATA [сODE=pas] ** [/сODE] DATA; echo preg_replace('#\s*(\[сode(?:\=[a-z]+)?\])\s*(.*?)\s*(\[/сode\])\s*#si','$1$2$3',$data); |
Сообщ.
#3
,
|
|
|
Цитата SiMM, 11.11.04, 09:11 Начальный и завершающий \s* - по вкусу спасибо. а что он даёт? |
Сообщ.
#4
,
|
|
|
пробелы
|
Сообщ.
#5
,
|
|
|
/(\[code\b[^\]]*\])\r\n(.*?)\r\n(\[/code\])/si
заменить на $1$2$3 Цитата SiMM, 11.11.04, 12:11 echo preg_replace('#\s*(\[сode(?:\=[a-z]+)?\])\s*(.*?)\s*(\[/сode\])\s*#si','$1$2$3',$data); Так могут и пробелы в начале и в конце откусться. |
Сообщ.
#6
,
|
|
|
Mixxx, в конце в них нет особого смысла, а в начале - это ещё надо подумать чуток (если стоит), чтобы ситуация, когда введено "[CODE]\s\r\n\s\r\n\s\sкод программы\s\s\s\r\n\n\r\n\r\n[/CODE]" преобразовываалась в "[CODE]\s\sкод программы[/CODE]
Добавлено И кстати, \r\n - это разве что под виндой ![]() |
Сообщ.
#7
,
|
|
|
\n
Добавлено Цитата SiMM, 11.11.04, 11:26 Mixxx, в конце в них нет особого смысла, а в начале - это ещё надо подумать чуток (если стоит), пробелы должны сохраняться, т.к. в любом коде есть отступы. И даже если они на первой строчке, всё-равно это отступы. |
Сообщ.
#8
,
|
|
|
Song, вообще-то я говорил о первых пустых строках, которые могут содержать и пробелы в том числе (а не о пробелах в первой строке - да, каюсь, изначально я о них не подумал), и о пустых строках/пробелах в конце - там они ни к чему. Либо приведите реальный пример, где это (пробелы и пустые строки в конце кода) критично.
|
Сообщ.
#9
,
|
|
|
ну например:
[ CODE ] t:=1; [ /CODE ] сначала идёт \n потом пробел, потом текст |
Сообщ.
#10
,
|
|
|
Song, я же просил пример, когда пробелы и пустые строки критичны в конце исходника
![]() |
Сообщ.
#11
,
|
|
|
а так регулярка у тебя в начале правильно отрабатывает? только в конце "неправильно" ?
Добавлено Попробовал, не работает, почему не понятно: [ CODE=pas ] test [ /CODE ] = ![]() ![]() test ![]() ![]() test |
Сообщ.
#12
,
|
|
|
Song,
(\[code\b[^\]]*\])[\r\n]+(.*?)[\r\n]+(\[\/code\]) заменить на $1$2$3 ключи si А ещё лучше два регекспа, они будут работать быстрее предыдущего который содержит метасимвол ".*?" с минимальным квантификатором. (\[code\b[^\]]*\])[\r\n]+ заменить на $1 ключ i [\r\n]+(\[\/code\]) заменить на $1 ключ i |
Сообщ.
#13
,
|
|
|
Mixxx,
в форум я вставил вот такую регулярку ![]() ![]() // cut \n at begin and end of code tag text $txt = preg_replace("#\s*(\[сode(?:\=[a-z]+)?\])\s*(.*?)\s*(\[/сode\])\s*#si", "$1$2$3", $txt); вот она и не работает |
Сообщ.
#14
,
|
|
|
Song, я же предупреждал, что буквы с я написал по русски - замените на английские.
|
Сообщ.
#15
,
|
|
|
из js файла вставляется [ code=pas ]\ n\ n[/code]
Поэтому должно. Но даже если так, есть мысли как исправить? Добавлено Цитата SiMM, 11.11.04, 19:01 Song, я же предупреждал, что буквы с я написал по русски - замените на английские. спасибо, я видел что ты предупреждал но я думал, что это касалось вот этого: Цитата SiMM, 11.11.04, 09:11 [сODE=pas] ** [/сODE] Щас потестю. Добавлено В принципе ничего, но вырезается первый пробел. Например [сode](один пробел)test (один пробел)test (два пробела)test[/сode] получаетcя ![]() ![]() test test test И ещё непонятно для чего после [/сode] вырезается \n т.е. пишу [сode] \n - вырезается 1 2 \n - вырезается [/сode]\n - почему этот вырезается? [другой тег] |
Сообщ.
#16
,
|
|
|
Song, так убери лишнее
![]() PCRE, Регулярные выражения, часть I + часть II Цитата Song, 11.11.04, 20:11 Сразу после [ code ] в регулярнике меняешь \s* на [\n\r]* (думать более красиво - лениво В принципе ничего, но вырезается первый пробел. ![]() Цитата Song, 11.11.04, 20:11 Убери поставленный в конце "по вкусу" \s*, т.е. (\[/code\])\s*# => (\[/code\])# И ещё непонятно для чего после [/сode] вырезается \n |
Сообщ.
#17
,
|
|
|
спасибо
Ок ![]() а перед [ code ] почему \n убирается? ![]() [ b ] test [ /b ] [ code ] code [ /code] [ b ] test [ /b ] получается после отработки [ b ] test [ /b ][ code ] code [ /code] [ b ] test [ /b ] |
Сообщ.
#18
,
|
|
|
Цитата Song, 11.11.04, 21:51 Благодаря добавленной по вкусу \s* вначале. #\s*(... => #(... а перед [ code ] почему \n убирается? |
Сообщ.
#19
,
|
|
|
Спасибо SiMM!
Вроде все варианты проверил! + 1 dgm ( До селе вроди так было P.S. Но если вдруг чего обнаружу, уж не откажи поправить ![]() |
Сообщ.
#20
,
|
|
|
Ещё вопросик, сделал тег [ IMG=alt ] адрес [ /IMG ]
Сначала у меня был такой вариант: ![]() ![]() preg_replace( "#\[img\s*=\s*(\S+?)\s*\](.*?)\[\/img\]#ie", ..... но он не работал когда в качестве alt'а указывается слово с пробелами, ну т.е. из нескольких слов: =xxx - так работает =xxx yyy - так не работает я заменил на ![]() ![]() preg_replace( "#\[img\s*=\s*(.*?)\s*\](.*?)\[\/img\]#ie" , Внимание вопрос! (© что где когда ![]() Правильно ли я сделал? с точки зрения правильности, защиты от XSS нападения, etc... |
Сообщ.
#21
,
|
|
|
Недостаток твоей регулярки в том, что она не отрабатывает тэги без указания alt'а (т.е. [img]адрес[/img] работать не будет). Я бы сделал строку поиска такой '#\[img\s*(?:=\s*?(.*)|)?\s*\](.*)\[/img\]#Uie'.
А вот по поводу защиты от XSS-нападения, к сожалению, ничего сказать не могу - не знаком с такой брешью. |
Сообщ.
#22
,
|
|
|
Цитата SiMM, 18.11.04, 12:24 Недостаток твоей регулярки в том, что она не отрабатывает тэги без указания alt'а (т.е. [img]адрес[/img] работать не будет). для неё отдельная регулярка Добавлено А вообще можно ламеру сказать что такое .*? в рег. выражении, т.к. именно это я изменил. Я \S+? поменял на .*? |
Сообщ.
#23
,
|
|
|
Song,
Шаблон .* очень жадный - ест всё до конца строки. Для устранения этой проблемы ставится еще и знак вопроса. |
Сообщ.
#24
,
|
|
|
ок тогда другой вопрос: почему в первом варианте не работало с двумя словами?
|
Сообщ.
#25
,
|
|
|
Цитата Song, 18.11.04, 14:50 ок тогда другой вопрос: почему в первом варианте не работало с двумя словами? ![]() ![]() preg_replace( "#\[img\s*=\s*(\S+?)\s*\](.*?)\[\/img\]#ie", ..... Потому что, после "[img = " (\[img\s*=\s*) он находил n-ное кол-во НЕпробельных символов - "xxx" ((\S+?)), и далее еще один пробел " " (\s*). Затем в строке по шаблону должна была идти одна закрывающаяся квадратная скобка "]" (\]), когда в обрабатываемой строке еще оставалось "yyy". На этом обработка и завершалась, без результата. |
Сообщ.
#26
,
|
|
|
Цитата Mastilior, 18.11.04, 13:44 ...либо используется модификатор U, чтобы сменить логику на противоположную.Шаблон .* очень жадный - ест всё до конца строки. Для устранения этой проблемы ставится еще и знак вопроса. Цитата Song, 18.11.04, 13:50 Потому что между словами был недопустим "пробельный" символ. почему в первом варианте не работало с двумя словами? |
Сообщ.
#27
,
|
|
|
SiMM, т.е. только пробел и недопустим?
Добавлено А как переделать \S+? чтобы ещё пробел допускался? |
Сообщ.
#28
,
|
|
|
.*?
![]() |
Сообщ.
#29
,
|
|
|
Цитата Song, 18.11.04, 15:26 А как переделать \S+? чтобы ещё пробел допускался? Лучше уж тогда писать ([^\]]*?) - до первого появления закрывающейся скобки. Добавлено Цитата SiMM, 18.11.04, 15:31 .* .+ было бы неправильно - а вдруг напишут [img]урл[/img] SiMM быстрее ![]() Song, если используешь .*, не забудь про то, что говорил SiMM в предыдущем посте. Уже исправил :) |
Сообщ.
#30
,
|
|
|
Цитата SiMM, 18.11.04, 13:31 .*? .+? было бы неправильно - а вдруг напишут [img]урл[/img] ну и пусть напишут, в ф-ию обработки параметр попадает пустым, а там проверка ![]() ![]() if ( !$alt ) $alt = "user posted image"; Добавлено А Цитата SiMM, 18.11.04, 13:31 разве спасёт от [ img=] ? .*? |
Сообщ.
#31
,
|
|
|
Это позволит обрабатывать ситуацию, когда после равенства нет ни одного символа. Вариант же с .+? предполагает, что после знака равенства будет не менее одного символа.
|
Сообщ.
#32
,
|
|
|
Цитата SiMM, 18.11.04, 15:50 Это позволит обрабатывать ситуацию, когда после равенства нет ни одного символа. и? Если там не будет, то он будет считать что знака "ровно" нет вообще? |
Сообщ.
#33
,
|
|
|
Цитата Song, 18.11.04, 18:02 Если там не будет, то он будет считать что знака "ровно" нет вообще? Нет, просто regexp не пройдет. |
Сообщ.
#34
,
|
|
|
Дык я так и не понял.
Что лучше Цитата SiMM, 18.11.04, 13:31 .*? или Цитата Mastilior, 18.11.04, 13:31 [^\]]*? ? |
Сообщ.
#35
,
|
|
|
Лучше то, что работает всегда
![]() ![]() ![]() |
Сообщ.
#36
,
|
|
|
Цитата Mastilior, 18.11.04, 16:19 Нет, просто regexp не пройдет. пишу регулярку с .*?: ![]() ![]() preg_replace( "#\[img\s*=\s*(.*?)\s*\](.*?)\[\/img\]#ie" и тег типа [имг=] проходит |
Сообщ.
#37
,
|
|
|
Собственно, я того и добивался, чтобы он проходил, но с пустым $1. А чего добиваетесь вы - мне не известно - вы же всех возможных ситуаций и необходимого в них поведения не указали.
Кстати, вариант с .+? вообще не будет обрабатывать строчку или же будет глючить, например, в следующем случае: ![]() ![]() echo preg_replace( "#\[img\s*=\s*(.+?)\s*\](.*?)\[\/img\]#ie","'alt=$1\turl=$2\n'",'[img=]url1[/img][img]url2[/img]'); |
Сообщ.
#38
,
|
|
|
Цитата Song, 18.11.04, 23:15 и тег типа [имг=] проходит Проходит, потому что везде стоит * (есть или нет). Если бы стоял +, то не проходил бы... |
Сообщ.
#39
,
|
|
|
понял, пасиб.
Добавлено Цитата SiMM, 18.11.04, 21:52 Собственно, я того и добивался, чтобы он проходил, но с пустым $1. А чего добиваетесь вы - мне не известно - вы же всех возможных ситуаций и необходимого в них поведения не указали. Просто я ещё в 20-ом сообщении этот вариант сам сделал. Поэтому и подумал, что мы окончательно к чему-то другому пришли, короче запутался. |
Сообщ.
#40
,
|
|
|
Это опять я
![]() Два вопроса: 1) наша устаканившаяся регулярка ![]() ![]() preg_replace("#(\[code(?:\=[a-z]+)?\])[\n\r]*(.*?)\s*(\[/code\])#si", не работает с тегом коде=СиШарп: [СODE=C#] test [/СODE] = ![]() ![]() test 2) Не получается отследить 3 числа после quote: [ quote=name, время, id ] quote [ /quote ] Пробую так: ![]() ![]() preg_replace( "#\[quote=([^\]]+?),([^\]]+?),([^\]]+?)\]#ie", "func('имя', 'время', 'id', почему-то время и id объединяются в один 3-ий параметр. |
Сообщ.
#41
,
|
|
|
1)
![]() ![]() preg_repladece("#(\[code(?:[^\]]+)?\])[\n\r]*(.*?)\s*(\[/code\])#si", 2) ![]() ![]() preg_replace("#\[quote=([^,]+),([^,]+),([^\]]+)\]#ie", |
Сообщ.
#42
,
|
|
|
1) спасибо большое, работает
2) без изменений, всё также в 3-ем параметре вырезается и время и id: "время, номер" |
Сообщ.
#43
,
|
|
|
2) Не воспроизводится.
![]() ![]() $str = '<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>name,время,id</span><div class='quote '>quote</div></div>'; echo preg_replace("#\[quote\=([^\]]+?),([^\]]+?),([^\]]+?)\]#ieU", "'$1_$2_$3'",$str); |
Сообщ.
#44
,
|
|
|
Цитата SiMM, 26.11.04, 22:12, 524858 2) Не воспроизводится. Это что значит? ![]() Это что не работает вариант Микса или это мне относится, не понял? ![]() Добавлено SiMM, получилось вот чего: Цитата name_время_idquote[ /quote ] Добавлено Понял! У меня запятых 4 штуки получается. Короче мне надо чтобы [q=Song, 26.11.04, 22:13, 524860]то что не работает вариа[/q] красная была $1 синяя была $2 зелёная была $3 |
Сообщ.
#45
,
|
|
|
Song, не воспроизводится - значит, что описанная вами проблема не воспроизводится у меня (скрипт я привёл). Подобная фраза - повод задуматься и дать реальный рабочий пример (входные условия), результат его работы и ожидаемый результат работы.
PS: ну так и добавьте дополнительный фактор в регулярник, чтобы он "захватывал" последний параметр в $3, либо же "хватал" в $2 запятую. |
Сообщ.
#46
,
|
|
|
Короче, я вот так сделал
![]() ![]() preg_replace( "#\[quote=([^\]]+?),([^\]]+?),([^\]]+?),([^\]]+?)\]#ie" , "('\\1', '\\2'.'\\3', '\\4')"... лучше варианта нет? |
Сообщ.
#47
,
|
|
|
Цитата SiMM, 27.11.04, 01:49 ну так и добавьте дополнительный фактор в регулярник, чтобы он "захватывал" последний параметр в $3, либо же "хватал" в $2 запятую. Да, примерно вот так: ![]() ![]() preg_replace("#\[quote=([^,]+),([^,]+),([^,]+),([^\]]+)\]#ie", |
Сообщ.
#48
,
|
|
|
Mixxx, а ты цитируешь через долгую читату что ли?
|
Сообщ.
#49
,
|
|
|
Цитата Song @ 27.11.04, 02:01 Mixxx, а ты цитируешь через долгую читату что ли? Нет через быструю. А вот щас специально через долгую. Это ты к чему? |
Сообщ.
#50
,
|
|
|
Цитата Mixxx, 26.11.04, 23:07, 524883 Это ты к чему? почему-то в твоём #47 нет 3-го параметра в quote Добавлено т.е. 4-го |
Сообщ.
#51
,
|
|
|
Цитата Song, 27.11.04, 01:13 Короче мне надо чтобы [q=Song, 26.11.04, 22:13, 524860]то что не работает вариа[/q] красная была $1 синяя была $2 зелёная была $3 А вон что! Сразу до меня не дошло (поздно уже). тогда так ![]() ![]() preg_replace("#\[quote=([^,]+),([^,]+,[^,]+),([^\]]+)\]#ie" , "('\\1', '\\2', '\\3')" |
Сообщ.
#52
,
|
|
|
[QUOTE=Mixxx,26.11.04, 23:13,524886]тогда так
![]() ![]() preg_replace("#\[quote=([^,]+),([^,]+,[^,]+),([^\]]+)\]#ie" , "('\\1', '\\2', '\\3')" Warning: Compilation failed: missing ) at offset 41 in /usr/local/www/votforum/htdocs/sources/lib/post_parser.php on line 1607 Добавлено Mixxx, А знаааю почему! У тебя же стоит безусловное кеширование js скриптов! ![]() обнови quote.js ![]() |
Сообщ.
#53
,
|
|
|
Цитата Song, 27.11.04, 02:18, 524890 Warning: Compilation failed: missing ) at offset 41 in /usr/local/www/votforum/htdocs/sources/lib/post_parser.php on line 1607 Попробуй ещё раз я отредактировал мессагу. Цитата Song, 27.11.04, 02:18, 524890 Mixxx, А знаааю почему! У тебя же стоит безусловное кеширование js скриптов! обнови quote.js Кеш прочистил. |
Сообщ.
#54
,
|
|
|
Mixxx, тогда они не парсятся. Ладно хер с ними, оставлю свой вариант, он работает.
Добавлено Большое спасибо за помощь. |