Regulärer Ausdruck übereinstimmen „wurde“ nicht mit vorangestelltem „html“
-
27-09-2019 - |
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)
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.
Andere Tipps
Für negativen Blick hinter und eine "micron" mehr Leistung, vielleicht negativ Blick hinter mit nicht-gierigem Matching:
(?<!html.*?)wap