Pregunta

Estoy usando Nginx para el tráfico móvil segmento entre un sitio móvil WAP / HTML. Parece que la mejor manera de hacer esto va a ser para comprobar la preferencia de la UA para el contenido marcando la cabecera HTTP Accept.

A preferencia por WAP se indica por la aparición de un tipo MIME 'wap' en la cabecera antes de que un 'html' o mimetype comodín.

Así que un Sony Ericsson W300i tiene una preferencia por 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

Y un Blackberry tiene una preferencia para 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

Desde que estoy en Nginx tierra, parece que la mejor herramienta que tengo es las expresiones regulares de NGINX (PCRE).

En este momento estoy tratando de utilizar una búsqueda negativa hacia delante para hacer valer "La aceptar cabecera contiene WAP pero no precedido de HTML":

(?!html.*)wap

Sin embargo, esto no es correcto. ¿Hay una manera diferente que puedo pensar en este problema? O mi lógica coincidencia?

Hasta ahora he encontrado estas expresiones regulares recursos útiles:

http://www.regular-expressions.info/completelines.html http://www.zytrax.com/tech/web/regex.htm http://wiki.nginx.org/NginxHttpRewriteModule

Gracias!


Gracias por la respuesta, aquí están las pruebas relacionadas:

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)
¿Fue útil?

Solución

La forma más sencilla de hacerlo es con una búsqueda hacia atrás en lugar de una búsqueda hacia delante. Dado que no es compatible se puede tratar de emular una búsqueda hacia atrás con una búsqueda hacia delante:

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

No es agradable de leer, pero debería funcionar.

Rubular

Otros consejos

Por detrás negativo mirada, y un "micra" más rendimiento, quizá aspecto negativo atrás con juego no expansivo:

(?<!html.*?)wap
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top