На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ALXR
  
    > Как задать шаблон, не содержащей заданный подшаблон?
      Например, можно ли записать шаблон для строки, состоящей из символов a,b,c,d, но не содержащей подстроку bad?

      acabadbcad - эта не подходит
      acadabbcad - эта подходит
      Сообщение отредактировано: S.Eugene -
        так иди на оборот. если подходит под шаблон bad то такую строку отвергаем. иначе принимаем.
          Цитата ViktorXP @
          так иди на оборот. если подходит под шаблон bad то такую строку отвергаем. иначе принимаем.

          А если мне такой отрицательное условие надо использовать внутри другого шаблона?

          Например, такая задача. Нужно найти и удалить все теги span такого вида <span class=bad>text</span>.

          Проблема в том, что они могут быть вложенные. Например так:
          <span class=bad>text11<span class=good>text2</span>text12</span>.

          Если в preg_replace применить шаблон
          $text = preg_replace( '/<span class=bad>(.+)<\/span>/', '$1', $text );

          То найдется вот это

          <span class=bad>text11<span class=good>text2</span>text12</span>.

          И после удаления получим
          text11<span class=good>text2 text12</span>.

          а должно получиться
          text11<span class=good>text2</span>text12.

          Нужно как-то указать, что между <span class=bad> и </span> не должно быть других открывающих тегов span, то есть не должно быть подстроки <span[^>]*>. При этом между ними могут быть любые другие теги.
          Сообщение отредактировано: S.Eugene -
            Цитата
            можно ли записать шаблон для строки, состоящей из символов a,b,c,d, но не содержащей подстроку bad?

            Цитата
            Нужно найти и удалить все теги span

            Ну вот опять - сперва автор спрашивает, как правильно класть срубы с помощью пилы, а в итоге выясняется, что нужно построить небоскреб.

            Надо бы написать правила раздела, и первым же пунктом: HTML не парсится регулярными выражениями! Регвыром можно разбить документ на теги (раздельно открывающие и закрывающие) и сырой текст. Затем другим регвыром анализировать имя и параметры открывающих тегов, чтобы определить, выводить их или нет. Все открывающие теги с флагом "выводить/не выводить" класть в стек, снимать при получении закрывающего тега.
              Лучше разобрать на DOM (например с помощью того же браузера) и искать соотв. методами (getElementsByClassName)
                S.Eugene, по-моему, там вообще всё удалится. У тебя не написано, что на первом <\/span> надо поиск завершать.

                Эта конкретная задача решается и регулярным выражением, но выражение получается слишком громоздким, чтобы вот так сразу его записать.
                И глубина вложений будет ограничена.

                Или можно сделать несколькими выражениями.

                Можно искать выражения /<span class=bad( .*?)>/, /<span( .*?)/ и /<\/span>/ и обрабатывать их как вложенные скобки, но придётся программировать.

                Можно поиграть с внутренними вложенными парами <span> </span>, проверяя. Но придётся цикл организовывать. Это можно даже в sed сделать.

                Регулярное выражение (tr1)
                /<span class=bad>(([^<]|<\/?([^s]|s([^p]|(p[^a]|a([^n]|n[^ >])))))[ >])*?<\/span>/
                находит <span class=bad>...</span>, если в него не вложено других <span>
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


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