Frage

Ich bin mit Nginx Segment mobilen Datenverkehr zwischen einer mobilen WAP / HTML-Seite. Sieht aus wie der beste Weg, dies zu tun, wird die UA Vorliebe für Inhalte durch Prüfung des HTTP-Accept-Header, um zu überprüfen.

Eine Präferenz für WAP wird durch das Auftreten eines ‚wap‘ MIME-Typs im Header vor einem ‚html‘ oder Wildcard-MIME-Typ angegeben.

So ein Sony Ericsson w300i eine Präferenz für WAP hat:

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

Und ein Blackberry Bold hat eine Vorliebe für 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

Da ich in NGINX Land bin, wie es scheint, das beste Werkzeug, das ich habe, ist NGINX regulärer Ausdrücke (PCRE).

Im Moment bin ich versucht, eine negative Vorschau zu behaupten, verwenden „Der Accept-Header enthält WAP, aber nicht von HTML-Voranstellung“:

(?!html.*)wap

Das ist aber nicht richtig. Gibt es eine andere Art, wie ich über dieses Problem denken kann? Oder meine Anpasslogik?

Bisher habe ich diese Regex Ressourcen nützlich gefunden:

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

Danke!


Danke für die Antwort, hier sind die damit verbundenen Tests:

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)
War es hilfreich?

Lösung

Der einfachste Weg, dies zu tun ist mit einem Lookbehind statt einem Look-Ahead. Da dies nicht unterstützt wird versuchen, Sie können ein Lookbehind mit einem Look-Ahead zu emulieren:

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

Nicht angenehm zu lesen, aber es sollte funktionieren.

Rubular

Andere Tipps

Für negativen Blick hinter und eine "micron" mehr Leistung, vielleicht negativ Blick hinter mit nicht-gierigem Matching:

(?<!html.*?)wap
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top