На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ALXR
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
    > Нужен preg_match , php
      Требуется определить, входит ли строка в другую строку, но вне определённого тега.

      В примере ниже нужно определить входит ли строка [GG] в строки:

      "бла бла бла [GG]бла-бла-бла[/GG]" - входит

      "бла бла бла" - не входит

      "бла [ CODE ]бла бла[ /CODE]" - не входит

      "бла бла бла [ CODE ][GG]бла-бла-бла[/GG][ /CODE ]" - входит, НО:
      если искомая строка "[GG]" входит внутри парного тега [ CODE ] тогда preg_match должен возвращать false. Поэтому не входит.

      такая строка "бла бла [GG] бла [ CODE ]бла-бла-бла[ /CODE ]" должна вернуть true т.к. [GG] присутствует и находится вне тега [ CODE ].

      Хорошо бы, чтобы ещё проверять и [ CODE ] и [GG] - парные.

      Добавлено
      strpos, как вы понимаете, я использовать не могу.

      Вариант, при котором нужно сначала удалить всё что внутри тега [ CODE ], а потом проверять по strpos не подходит, т.к. тормозной.
        Дарю, вот!

        ExpandedWrap disabled
          #(?<!\\[CODE\\])\\[GG\\](.*?)\\[/GG\\](?!\\[CODE\\])#i


        Все приведенные тобой test cases прошли. Кроме того, должно захватить то, что внутри [GG]...[/GG].
          Спасибо.

          Цитата Ho Im @
          Кроме того, должно захватить то, что внутри [GG]...[/GG].

          Это как понять?
            А, вдогонку: The F*cking Manual, с которого я это почерпнул -- perldoc perlre, полный референс по регуляркам перла. Там рассказывается о таких замечательных вещах, как zero-width look-{ahead,behind} assertions, которые в данном случае делают то, что нужно.

            Добавлено
            Ну, там же .*? намеренно в скобки взят, чтобы потом в третий аргумент preg_match его можно было отловить.
              Ho Im
              ещё бы добавить поддержку не только [ CODE ] ... [ /CODE ]
              а ещё + [ CODE=произвольные_символы_включая_пробелы ] ... [ /CODE ]

              Внутри них тоже не должно GG срабатывать.
                Держи.

                #(?<!\\[CODE.*?\\])\\[GG\\](.*?)\\[/GG\\](?!\\[/CODE\\])#i

                Учти, в первом примере ошибка (копипейст не работал, и я его руками набивал): в конце смотрит не на[/CODE], а [CODE]. Здесь поправил.

                Естессно, учитываются все символы до закрывающей квадратной скобки, даже если ее закавычить. Если это не то, что требуется, то надо еще чуть подумать.
                  Ho Im
                  смотри чего php написал:
                  Цитата
                  Warning: Compilation failed: lookbehind assertion is not fixed length at offset 15 in /usr/local/www/votforum/htdocs/TEST/sources/functions.php on line 59


                  59-ая это:
                  ExpandedWrap disabled
                    preg_match("#(?<!\\[CODE.*?\\])\\[GG\\](.*?)\\[/GG\\](?!\\[/CODE\\])#i", $post)
                    А, блин, я слажал -- "смотреть назад" можно только на паттерны фиксированной длины. Подумаем щас, как это обойти. Тебе ничего, кроме ответа да/нет, не надо?

                    Добавлено
                    "#(?!\\[CODE.*?\\])\\[GG\\](.*?)\\[/GG\\](?!\\[/CODE\\])#i" у меня заработал.
                      Советую сделать так:
                      ExpandedWrap disabled
                        preg_match("#\\[GG\\].*?\\[/GG\\](?!(?:(?!\\[CODE.*?\\]).)*?\\[/CODE\\])#i", $post)

                      Будет работать при условии что все теги code парные.
                      ЗЫ Кстати в языках NET можно заглядывать назад на любую глубину :)
                        Mixxx, это один фиг с моим.

                        Добавлено
                        Mixxx, [gg]as[/gg][gg]ansa[/gg][ /code ] твоим не пропускается.
                        Моим пропустился. Значит, не один фиг :)
                          Спасибо, Ho Im
                            Цитата Ho Im @
                            Mixxx, [gg]as[/gg][gg]ansa[/gg][ /code ] твоим не пропускается.
                            Моим пропустился. Значит, не один фиг

                            Ещё твой пропустит
                            ExpandedWrap disabled
                               [ code ]  [GG] [/GG]текст[/ code ]

                            А мой пропустит вот это
                            ExpandedWrap disabled
                              [GG] [/GG][ code ] [/ code ]
                            (Что есть правильно)
                            :ph34r:
                            Сообщение отредактировано: Mixxx -
                              Mixxx
                              но всё-таки твой пропускает
                              Цитата Ho Im @
                              [gg]as[/gg][gg]ansa[/gg][ /code ]

                              ?
                              т.е. он должен возвращать единицу, а он не возвращает.
                                Цитата Song @
                                Mixxx
                                но всё-таки твой пропускает
                                Цитата (Ho Im @ Вчера, 22:51)
                                [gg]as[/gg][gg]ansa[/gg][ /code ]

                                ?
                                т.е. он должен возвращать единицу, а он не возвращает.

                                Я ж говорю что теги code должны быть парными. Т.е. в данном случае
                                полная картина должна выглядеть так
                                [ code ][gg]as[/gg][gg]ansa[/gg][ /code ]
                                Поэтому функция должна возвращать false :)
                                  Вообще-то ошметок тега, который неверно либо спарен, либо сам по себе неверен, должен бы по идее возвращаться в своем первоначальном виде. Как и [GG]. То есть, ничего особенного в нем не должно замечаться.
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0698 ]   [ 15 queries used ]   [ Generated: 7.05.24, 08:07 GMT ]