На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ALXR
  
    > Регулярку бы.. :) , выкусить лишний перевод строки
      Как вы заметили у нас в форуме тег CODE вставляется так:
      (например)
      [ CODE=pas ]
      **
      [/CODE]

      Юзер вставляет курсор в пустую строку ** и добавляет туда текст, получается вот чего:
      [ CODE=pas ] (лишний \n)
      MySuperProgram1
      MySuperProgram2 (лишний \n)
      [/CODE]

      и так программа из-за этого выглядит так:
      ExpandedWrap disabled
         
        MySuperProgram1
        MySuperProgram2


      Как бы убрать эти лишние \n если они есть при сохранении поста так:
      [ CODE=pas ]MySuperProgram1
      MySuperProgram2[/CODE]

      и тогда тег CODE будет выглядеть так красиво:
      ExpandedWrap disabled
        MySuperProgram1
        MySuperProgram2


      Короче нужно регулярное выражение. Также нужно учесть что code может быть без указания синтаксиса, просто [ code ] .. [ /code ]
        ExpandedWrap disabled
          $data = <<<DATA
          [сODE=pas]
          **
          [/сODE]
          DATA;
          echo preg_replace('#\s*(\[сode(?:\=[a-z]+)?\])\s*(.*?)\s*(\[/сode\])\s*#si','$1$2$3',$data);
        Начальный и завершающий \s* - по вкусу (первая буква C в коде заменена на русскую букву C)
        Сообщение отредактировано: SiMM -
          Цитата SiMM, 11.11.04, 09:11
          Начальный и завершающий \s* - по вкусу

          спасибо.
          а что он даёт?
            пробелы
              /(\[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);

              Так могут и пробелы в начале и в конце откусться.
                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 - это разве что под виндой ;) на практике может быть только \n (*nix?) или только \r (Mac?)
                Сообщение отредактировано: SiMM -
                  \n

                  Добавлено
                  Цитата SiMM, 11.11.04, 11:26
                  Mixxx, в конце в них нет особого смысла, а в начале - это ещё надо подумать чуток (если стоит),

                  пробелы должны сохраняться, т.к. в любом коде есть отступы. И даже если они на первой строчке, всё-равно это отступы.
                    Song, вообще-то я говорил о первых пустых строках, которые могут содержать и пробелы в том числе (а не о пробелах в первой строке - да, каюсь, изначально я о них не подумал), и о пустых строках/пробелах в конце - там они ни к чему. Либо приведите реальный пример, где это (пробелы и пустые строки в конце кода) критично.
                      ну например:
                      [ CODE ]
                      t:=1;
                      [ /CODE ]

                      сначала идёт \n потом пробел, потом текст
                        Song, я же просил пример, когда пробелы и пустые строки критичны в конце исходника :)
                          а так регулярка у тебя в начале правильно отрабатывает? только в конце "неправильно" ?

                          Добавлено
                          Попробовал, не работает, почему не понятно:
                          [ CODE=pas ]
                          test
                          [ /CODE ]

                          =
                          ExpandedWrap disabled
                            test
                          а должно быть
                          ExpandedWrap disabled
                            test
                          Сообщение отредактировано: Song -
                            Song,
                            (\[code\b[^\]]*\])[\r\n]+(.*?)[\r\n]+(\[\/code\]) заменить на $1$2$3 ключи si

                            А ещё лучше два регекспа, они будут работать быстрее предыдущего который содержит метасимвол ".*?" с минимальным квантификатором.

                            (\[code\b[^\]]*\])[\r\n]+ заменить на $1 ключ i
                            [\r\n]+(\[\/code\]) заменить на $1 ключ i
                              Mixxx,
                              в форум я вставил вот такую регулярку
                              ExpandedWrap disabled
                                // 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);
                              Добавлено
                              вот она и не работает
                                Song, я же предупреждал, что буквы с я написал по русски - замените на английские.
                                  из 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я
                                  ExpandedWrap disabled
                                    test
                                     test
                                      test
                                  Добавлено
                                  И ещё непонятно для чего после [/сode] вырезается \n
                                  т.е. пишу
                                  [сode] \n - вырезается
                                  1
                                  2 \n - вырезается
                                  [/сode]\n - почему этот вырезается?
                                  [другой тег]
                                    Song, так убери лишнее ;)
                                    PCRE, Регулярные выражения, часть I + часть II
                                    Цитата Song, 11.11.04, 20:11
                                    В принципе ничего, но вырезается первый пробел.
                                    Сразу после [ code ] в регулярнике меняешь \s* на [\n\r]* (думать более красиво - лениво ;) - похоже, оно вам не надо)
                                    Цитата Song, 11.11.04, 20:11
                                    И ещё непонятно для чего после [/сode] вырезается \n
                                    Убери поставленный в конце "по вкусу" \s*, т.е. (\[/code\])\s*# => (\[/code\])#
                                      спасибо
                                      Ок :)
                                      а перед [ code ] почему \n убирается? :)

                                      [ b ] test [ /b ]
                                      [ code ] code [ /code]
                                      [ b ] test [ /b ]

                                      получается после отработки
                                      [ b ] test [ /b ][ code ] code [ /code]
                                      [ b ] test [ /b ]
                                        Цитата Song, 11.11.04, 21:51
                                        а перед [ code ] почему \n убирается?
                                        Благодаря добавленной по вкусу \s* вначале. #\s*(... => #(...
                                          Спасибо SiMM!
                                          Вроде все варианты проверил!
                                          + 1 dgm ( До селе вроди так было

                                          P.S. Но если вдруг чего обнаружу, уж не откажи поправить :)
                                          Сообщение отредактировано: SergeS -
                                            Ещё вопросик, сделал тег [ IMG=alt ] адрес [ /IMG ]
                                            Сначала у меня был такой вариант:
                                            ExpandedWrap disabled
                                              preg_replace( "#\[img\s*=\s*(\S+?)\s*\](.*?)\[\/img\]#ie", .....

                                            но он не работал когда в качестве alt'а указывается слово с пробелами, ну т.е. из нескольких слов:
                                            =xxx - так работает
                                            =xxx yyy - так не работает

                                            я заменил на
                                            ExpandedWrap disabled
                                              preg_replace( "#\[img\s*=\s*(.*?)\s*\](.*?)\[\/img\]#ie" ,
                                            - так работает

                                            Внимание вопрос! (© что где когда :))
                                            Правильно ли я сделал?
                                            с точки зрения правильности, защиты от XSS нападения, etc...
                                              Недостаток твоей регулярки в том, что она не отрабатывает тэги без указания alt'а (т.е. [img]адрес[/img] работать не будет). Я бы сделал строку поиска такой '#\[img\s*(?:=\s*?(.*)|)?\s*\](.*)\[/img\]#Uie'.
                                              А вот по поводу защиты от XSS-нападения, к сожалению, ничего сказать не могу - не знаком с такой брешью.
                                                Цитата SiMM, 18.11.04, 12:24
                                                Недостаток твоей регулярки в том, что она не отрабатывает тэги без указания alt'а (т.е. [img]адрес[/img] работать не будет).

                                                для неё отдельная регулярка

                                                Добавлено
                                                А вообще можно ламеру сказать что такое .*? в рег. выражении, т.к. именно это я изменил. Я \S+? поменял на .*?
                                                  Song,
                                                  Шаблон .* очень жадный - ест всё до конца строки. Для устранения этой проблемы ставится еще и знак вопроса.
                                                    ок тогда другой вопрос: почему в первом варианте не работало с двумя словами?
                                                      Цитата Song, 18.11.04, 14:50
                                                      ок тогда другой вопрос: почему в первом варианте не работало с двумя словами?

                                                      ExpandedWrap disabled
                                                        preg_replace( "#\[img\s*=\s*(\S+?)\s*\](.*?)\[\/img\]#ie", .....

                                                      Потому что, после "[img = " (\[img\s*=\s*) он находил n-ное кол-во НЕпробельных символов - "xxx" ((\S+?)), и далее еще один пробел " " (\s*). Затем в строке по шаблону должна была идти одна закрывающаяся квадратная скобка "]" (\]), когда в обрабатываемой строке еще оставалось "yyy". На этом обработка и завершалась, без результата.
                                                        Цитата Mastilior, 18.11.04, 13:44
                                                        Шаблон .* очень жадный - ест всё до конца строки. Для устранения этой проблемы ставится еще и знак вопроса.
                                                        ...либо используется модификатор U, чтобы сменить логику на противоположную.
                                                        Цитата Song, 18.11.04, 13:50
                                                        почему в первом варианте не работало с двумя словами?
                                                        Потому что между словами был недопустим "пробельный" символ.
                                                          SiMM, т.е. только пробел и недопустим?

                                                          Добавлено
                                                          А как переделать \S+? чтобы ещё пробел допускался?
                                                            .*? ;) .+? было бы неправильно - а вдруг напишут [img=]урл[/img]
                                                            Сообщение отредактировано: SiMM -
                                                              Цитата Song, 18.11.04, 15:26
                                                              А как переделать \S+? чтобы ещё пробел допускался?

                                                              Лучше уж тогда писать ([^\]]*?) - до первого появления закрывающейся скобки.

                                                              Добавлено
                                                              Цитата SiMM, 18.11.04, 15:31
                                                              .* .+ было бы неправильно - а вдруг напишут [img]урл[/img]

                                                              SiMM быстрее ;)

                                                              Song, если используешь .*, не забудь про то, что говорил SiMM в предыдущем посте. Уже исправил :)
                                                                Цитата SiMM, 18.11.04, 13:31
                                                                .*? .+? было бы неправильно - а вдруг напишут [img]урл[/img]

                                                                ну и пусть напишут, в ф-ию обработки параметр попадает пустым, а там проверка
                                                                ExpandedWrap disabled
                                                                  if ( !$alt ) $alt = "user posted image";


                                                                Добавлено
                                                                А
                                                                Цитата SiMM, 18.11.04, 13:31
                                                                .*?
                                                                разве спасёт от [ img=] ?
                                                                  Это позволит обрабатывать ситуацию, когда после равенства нет ни одного символа. Вариант же с .+? предполагает, что после знака равенства будет не менее одного символа.
                                                                    Цитата SiMM, 18.11.04, 15:50
                                                                    Это позволит обрабатывать ситуацию, когда после равенства нет ни одного символа.

                                                                    и? Если там не будет, то он будет считать что знака "ровно" нет вообще?
                                                                      Цитата Song, 18.11.04, 18:02
                                                                      Если там не будет, то он будет считать что знака "ровно" нет вообще?

                                                                      Нет, просто regexp не пройдет.
                                                                        Дык я так и не понял.
                                                                        Что лучше
                                                                        Цитата SiMM, 18.11.04, 13:31
                                                                        .*?

                                                                        или
                                                                        Цитата Mastilior, 18.11.04, 13:31
                                                                        [^\]]*?

                                                                        ?
                                                                          Лучше то, что работает всегда ;) У любой задачи может быть множество решений - определить лучшее из них может быть ещё более сложной задачей, чем найти само решение :) Плюс ко всему - на вкус и цвет... ;)
                                                                            Цитата Mastilior, 18.11.04, 16:19
                                                                            Нет, просто regexp не пройдет.

                                                                            пишу регулярку с .*?:
                                                                            ExpandedWrap disabled
                                                                              preg_replace( "#\[img\s*=\s*(.*?)\s*\](.*?)\[\/img\]#ie"

                                                                            и тег типа [имг=] проходит
                                                                              Собственно, я того и добивался, чтобы он проходил, но с пустым $1. А чего добиваетесь вы - мне не известно - вы же всех возможных ситуаций и необходимого в них поведения не указали.
                                                                              Кстати, вариант с .+? вообще не будет обрабатывать строчку или же будет глючить, например, в следующем случае:
                                                                              ExpandedWrap disabled
                                                                                echo preg_replace( "#\[img\s*=\s*(.+?)\s*\](.*?)\[\/img\]#ie","'alt=$1\turl=$2\n'",'[img=]url1[/img][img]url2[/img]');
                                                                              Сообщение отредактировано: SiMM -
                                                                                Цитата Song, 18.11.04, 23:15
                                                                                и тег типа [имг=] проходит

                                                                                Проходит, потому что везде стоит * (есть или нет). Если бы стоял +, то не проходил бы...
                                                                                  понял, пасиб.

                                                                                  Добавлено
                                                                                  Цитата SiMM, 18.11.04, 21:52
                                                                                  Собственно, я того и добивался, чтобы он проходил, но с пустым $1. А чего добиваетесь вы - мне не известно - вы же всех возможных ситуаций и необходимого в них поведения не указали.

                                                                                  Просто я ещё в 20-ом сообщении этот вариант сам сделал. Поэтому и подумал, что мы окончательно к чему-то другому пришли, короче запутался.
                                                                                    Это опять я :)
                                                                                    Два вопроса:
                                                                                    1) наша устаканившаяся регулярка
                                                                                    ExpandedWrap disabled
                                                                                      preg_replace("#(\[code(?:\=[a-z]+)?\])[\n\r]*(.*?)\s*(\[/code\])#si",


                                                                                    не работает с тегом коде=СиШарп:
                                                                                    [СODE=C#]
                                                                                    test
                                                                                    [/СODE] =
                                                                                    ExpandedWrap disabled
                                                                                       
                                                                                      test


                                                                                    2) Не получается отследить 3 числа после quote:
                                                                                    [ quote=name, время, id ] quote [ /quote ]
                                                                                    Пробую так:
                                                                                    ExpandedWrap disabled
                                                                                      preg_replace( "#\[quote=([^\]]+?),([^\]]+?),([^\]]+?)\]#ie", "func('имя', 'время', 'id',

                                                                                    почему-то время и id объединяются в один 3-ий параметр.
                                                                                      1)
                                                                                      ExpandedWrap disabled
                                                                                         preg_repladece("#(\[code(?:[^\]]+)?\])[\n\r]*(.*?)\s*(\[/code\])#si",

                                                                                      2)
                                                                                      ExpandedWrap disabled
                                                                                        preg_replace("#\[quote=([^,]+),([^,]+),([^\]]+)\]#ie",
                                                                                        1) спасибо большое, работает
                                                                                        2) без изменений, всё также в 3-ем параметре вырезается и время и id: "время, номер"
                                                                                          2) Не воспроизводится.
                                                                                          ExpandedWrap disabled
                                                                                            $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);
                                                                                            Цитата 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
                                                                                              Song, не воспроизводится - значит, что описанная вами проблема не воспроизводится у меня (скрипт я привёл). Подобная фраза - повод задуматься и дать реальный рабочий пример (входные условия), результат его работы и ожидаемый результат работы.
                                                                                              PS: ну так и добавьте дополнительный фактор в регулярник, чтобы он "захватывал" последний параметр в $3, либо же "хватал" в $2 запятую.
                                                                                              Сообщение отредактировано: SiMM -
                                                                                                Короче, я вот так сделал
                                                                                                ExpandedWrap disabled
                                                                                                  preg_replace( "#\[quote=([^\]]+?),([^\]]+?),([^\]]+?),([^\]]+?)\]#ie"   , "('\\1', '\\2'.'\\3', '\\4')"...


                                                                                                лучше варианта нет?
                                                                                                  Цитата SiMM, 27.11.04, 01:49
                                                                                                  ну так и добавьте дополнительный фактор в регулярник, чтобы он "захватывал" последний параметр в $3, либо же "хватал" в $2 запятую.

                                                                                                  Да, примерно вот так:
                                                                                                  ExpandedWrap disabled
                                                                                                    preg_replace("#\[quote=([^,]+),([^,]+),([^,]+),([^\]]+)\]#ie",
                                                                                                    Mixxx, а ты цитируешь через долгую читату что ли?
                                                                                                      Цитата Song @ 27.11.04, 02:01
                                                                                                      Mixxx, а ты цитируешь через долгую читату что ли?

                                                                                                      Нет через быструю.
                                                                                                      А вот щас специально через долгую.
                                                                                                      Это ты к чему?
                                                                                                        Цитата Mixxx, 26.11.04, 23:07, 524883
                                                                                                        Это ты к чему?

                                                                                                        почему-то в твоём #47 нет 3-го параметра в quote

                                                                                                        Добавлено
                                                                                                        т.е. 4-го
                                                                                                          Цитата Song, 27.11.04, 01:13
                                                                                                          Короче мне надо чтобы
                                                                                                          [q=Song, 26.11.04, 22:13, 524860]то что не работает вариа[/q]
                                                                                                          красная была $1
                                                                                                          синяя была $2
                                                                                                          зелёная была $3

                                                                                                          А вон что! Сразу до меня не дошло (поздно уже).
                                                                                                          тогда так

                                                                                                          ExpandedWrap disabled
                                                                                                            preg_replace("#\[quote=([^,]+),([^,]+,[^,]+),([^\]]+)\]#ie"   , "('\\1', '\\2', '\\3')"
                                                                                                          Сообщение отредактировано: Mixxx -
                                                                                                            [QUOTE=Mixxx,26.11.04, 23:13,524886]тогда так

                                                                                                            ExpandedWrap disabled
                                                                                                              preg_replace("#\[quote=([^,]+),([^,]+,[^,]+),([^\]]+)\]#ie"   , "('\\1', '\\2', '\\3')"
                                                                                                            [/QUOTE]
                                                                                                            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 :D
                                                                                                              Цитата 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

                                                                                                              Кеш прочистил.
                                                                                                                Mixxx, тогда они не парсятся. Ладно хер с ними, оставлю свой вариант, он работает.

                                                                                                                Добавлено
                                                                                                                Большое спасибо за помощь.
                                                                                                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                                                                                0 пользователей:


                                                                                                                Рейтинг@Mail.ru
                                                                                                                [ Script execution time: 0,1713 ]   [ 14 queries used ]   [ Generated: 9.07.25, 02:15 GMT ]