estranho apache reescrever regex

1

Estou no processo de migrar uma configuração do apache para o nginx. Neste processo, encontrei essa regra de reescrita em um arquivo .htaccess:

RewriteRule ^/?(?:(?!one|two|three|four).?)+/?$ http://somewhere.else.com [R=301,L]

Eu sou muito bom em regex normalmente, mas isso está muito além de mim. Para começar, eu não sabia que parênteses embutidos eram permitidos. Alguém pode explicar esse regex para mim? E se é uma coisa única do apache, como eu posso replicar isso no nginx?

    
por Mediocre Gopher 05.08.2011 / 20:30

2 respostas

4
  1. (?!one|two|three|four) significa "NÃO (um ou dois ou três ou quatro)".

  2. O ?: significa grupo que não captura (portanto, você não pode referenciá-lo usando $N , por exemplo, $1 ).

  3. Tudo junto significa praticamente QUALQUER texto que não tenha "uma" ou "duas" ou "três" ou "quatro" sequências.

Por exemplo:

Este URL /categories/category-1/hello-kitten/ , se aplicado à regra acima, será redirecionado. Mas esse /categoneries/category-1/hello-kitten/ não será, já que tem sequência um nele: / categ *** one *** ries / category-1 / hello-kitten /

    
por 05.08.2011 / 21:49
2

Veja algumas informações mais específicas e detalhadas, caso isso ajude:

' ^/?(?:(?!one|two|three|four).?)+/?$ http://somewhere.else.com [R=301,L]
' 
' Options: case insensitive
' 
' Assert position at the beginning of the string «^»
' Match the character “/” literally «/?»
'    Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
' Match the regular expression below «(?:(?!one|two|three|four).?)+»
'    Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
'    Assert that it is impossible to match the regex below starting at this position (negative lookahead) «(?!one|two|three|four)»
'       Match either the regular expression below (attempting the next alternative only if this one fails) «one»
'          Match the characters “one” literally «one»
'       Or match regular expression number 2 below (attempting the next alternative only if this one fails) «two»
'          Match the characters “two” literally «two»
'       Or match regular expression number 3 below (attempting the next alternative only if this one fails) «three»
'          Match the characters “three” literally «three»
'       Or match regular expression number 4 below (the entire group fails if this one fails to match) «four»
'          Match the characters “four” literally «four»
'    Match any single character that is not a line break character «.?»
'       Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
' Match the character “/” literally «/?»
'    Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
' Assert position at the end of the string (or before the line break at the end of the string, if any) «$»
' Match the characters “ http://somewhere” literally « http://somewhere»
' Match any single character that is not a line break character «.»
' Match the characters “else” literally «else»
' Match any single character that is not a line break character «.»
' Match the characters “com ” literally «com »
' Match a single character present in the list “R=301,L” «[R=301,L]»
    
por 06.12.2011 / 06:43