Domanda

sto usando Nginx al traffico mobile segmento tra un / sito HTML WAP. Sembra il modo migliore per fare questo sta per essere quello di controllare la preferenza del UA per i contenuti controllando l'HTTP Accept intestazione.

Una preferenza per WAP è indicato dalla comparsa di un tipo MIME 'wap' nell'intestazione prima di un 'html' o mimetype jolly.

Quindi un W300i Sony Ericsson ha una preferenza per 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 un Blackberry Bold ha una preferenza per 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

Dal momento che sono nella terra di Nginx, sembra che lo strumento migliore che ho è espressioni regolari di Nginx (PCRE).

In questo momento sto cercando di utilizzare un lookahead negativo per affermare "Accept intestazione contiene WAP ma non preceduto da HTML":

(?!html.*)wap

Ma questo non è corretto. C'è un modo diverso che posso pensare a questo problema? O la mia logica di corrispondenza?

Finora ho trovato queste risorse regex utili:

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

Grazie!


Grazie per la risposta, ecco le prove relative:

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)
È stato utile?

Soluzione

Il modo più semplice per farlo è con un lookbehind invece di un lookahead. Dal momento che non è supportato si può cercare di emulare un lookbehind con un lookahead:

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

Non è piacevole da leggere, ma dovrebbe funzionare.

Rubular

Altri suggerimenti

Per dietro negativo aspetto, e un "micron" maggiori prestazioni, forse aspetto negativo dietro con la corrispondenza non avido:

(?<!html.*?)wap
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top