На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ALXR
Страницы: (4) [1] 2 3 ... Последняя » все  ( Перейти к последнему сообщению )  
    > Регулярку бы.. :) , выкусить лишний перевод строки
      Как вы заметили у нас в форуме тег 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 - почему этот вырезается?
                                  [другой тег]
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0389 ]   [ 15 queries used ]   [ Generated: 4.05.24, 18:03 GMT ]