Pergunta

Estou usando o nginx para segmentar o tráfego móvel entre um site móvel wap/html. Parece que a melhor maneira de fazer isso é verificar a preferência do UA pelo conteúdo, verificando o cabeçalho HTTP aceitar.

Uma preferência pelo WAP é indicada pelo aparecimento de um mimetype 'WAP' no cabeçalho antes de um 'html' ou mimetype curinga.

Então, um Sony Ericsson W300i tem uma preferência pelo WAP:

multipart/mixed, application/vnd.wap.multpart.mixed,applicatnoin/vnd.wap.xhtml_xml,application/xhtml+xml,text/ved.wap.wl,*/*,text/x-hdml,image/mng,/\image/x-mng,ivdeo/mng,video/x-mng,ima/gebmp,text/html

E um BlackBerry Bold tem uma preferência pelo HTML:

text/html,application/xhtml+xml,application/vnd.wap.xhtml+xml,application/vnd.wp.wmlc;q=0.9,application/vnd.awp.wmlscriptc;q=0.7,text/vnd.wap.wml;q=07,/vnd/.sun.j2me.app-descriptor,*/*;q=0.5

Como estou em Nginx Land, parece que a melhor ferramenta que tenho são as expressões regulares da Nginx (PCRE).

No momento, estou tentando usar uma aparência negativa para afirmar "o cabeçalho aceita contém WAP, mas não precedido por html":

(?!html.*)wap

Mas isso não está correto. Existe uma maneira diferente de pensar sobre esse problema? Ou minha lógica correspondente?

Até agora, achei esses recursos regex úteis:

http://www.regular-expressions.info/completelines.htmlhttp://www.zytrax.com/tech/web/regex.htmhttp://wiki.nginx.org/nginxhttPrewritemodule

Obrigado!


Obrigado pela resposta, aqui estão os testes relacionados:

import re

prefers_wap_re = re.compile(r'^(?!(?:(?!wap).)*html).*?wap', re.I)

tests = [
    ('', False),
    ('wap', True),
    ('wap html', True),
    ('html wap', False),
]

for test, expected in tests:
    result = prefers_wap_re.search(test)
    assert bool(result) is expected, \
        'Tested "%s", expected %s, got %s.' % (test, expected, result)
Foi útil?

Solução

A maneira mais simples de fazer isso é com um lookbehind em vez de uma aparência. Como isso não é suportado, você pode tentar imitar um lookbehind com uma aparência:

^(?!(?:(?!wap).)*html).*?wap

Não é agradável de ler, mas deve funcionar.

Rubular

Outras dicas

Para uma olhada negativa para trás e um "Micron" mais desempenho, talvez uma olhada negativa com a correspondência sem graça:

(?<!html.*?)wap
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top