espressione regolare per corrispondenza “è stato” non preceduto da “html”
-
27-09-2019 - |
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)
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.
Altri suggerimenti
Per dietro negativo aspetto, e un "micron" maggiori prestazioni, forse aspetto negativo dietro con la corrispondenza non avido:
(?<!html.*?)wap