Регулярный экспресс: как исключить несколько групп символов? - PullRequest
10 голосов
/ 08 января 2010

У меня есть набор URL:

/ продукты

/ категории

/ клиенты

Теперь говорят клиентыМеня зовут Джон, и я хочу помочь Джону зайти на страницу своего аккаунта с более коротким URL:

before : /customers/john
after  : /john

(предположим, имена клиентов уникальны)

Я пытаюсь выяснитьправильный диспетчер регулярных выражений, чтобы все клиенты могли иметь эту функцию:

/marry
/james
/tony-the-red-beard

вот что я получил сейчас (в PHP):

'/^\/([^(products|categories|admin)].+)$/' => /customers/$1

Это не похоже на работу.Кто-нибудь может мне помочь?

Ответы [ 3 ]

18 голосов
/ 08 января 2010

Здесь вам нужен негативный взгляд утверждение . Вы хотите сказать: «Я хочу сопоставить любую строку символов, кроме этих конкретных строк». Утверждение в регулярном выражении может совпадать со строкой, но оно не потребляет каких-либо символов, что позволяет сопоставить эти символы с остальными частями вашего регулярного выражения. Вы можете указать отрицательное утверждение, обернув шаблон в (?! и ).

'/^\/(?!products|categories|admin)(.+)$/'

Обратите внимание, что вместо этого может потребоваться следующее, если вы не разрешаете именам клиентов включать косую черту:

'/^\/(?!products|categories|admin)([^/]+)$/'
8 голосов
/ 08 января 2010

Это совершенно неправильный способ решения проблемы, но можно выразить фиксированные отрицательные взгляды без использования отрицательных взглядов. Дополнительный интервал для ясности:

^ (
( $ | [^/] |
  / ( $ | [^pc] |
    p ( $ | [^r] |
      r ( $ | [^o] |
        o ( $ | [^d] |
          d ( $ | [^u] |
            u ( $ | [^c] |
              c ( $ | [^t] |
                t ( $ | [^s] ))))))) |
    c ( $ | [^au] |
      a ( $ | [^t] |
        t ( $ | [^e] |
          e ( $ | [^g] |
            g ( $ | [^o] |
              o ( $ | [^r] |
                r ( $ | [^i] |
                  i ( $ | [^e] |
                    e ( $ | [^s] )))))))) |
      u ( $ | [^s] |
        s ( $ | [^t] |
          t ( $ | [^o] |
            o ( $ | [^m] |
              m ( $ | [^e] |
                e ( $ | [^r] |
                  r ( $ | [^s] ))))))))))
) .* ) $
0 голосов
/ 08 января 2010

Вы пытаетесь использовать отрицательный класс персонажей неправильно.Отрицательный класс символов говорит «не совпадают с содержащимися символами».То, что вы хотите сказать, это «не совпадают, если этот материал, который я здесь указал, существует».Для этого вам нужно немного более креативно.Вероятно, нужен негативный взгляд назад.Я не уверен на 100% в движке регулярных выражений php, но что-то похожее на это должно сработать.

/^\/(?<!(?:products|categories|admin))(.+)$/

, поэтому отрицательный взгляд позади (?<! ... ) говорит, что не соответствует .+, если products или categories или admin предшествуют этому.Тогда это в не захватывающей группе (?: ... ).

Проверьте Справочник по синтаксису регулярных выражений для получения дополнительной помощи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...