Expression régulière pour correspondre à « wap » non précédé de « html »
-
27-09-2019 - |
Question
J'utilise Nginx pour segmenter le trafic mobile entre un WAP / site HTML mobile. On dirait que la meilleure façon en cochant la HTTP Accept faire va être de vérifier la préférence de l'UA pour le contenu en-tête.
Une préférence pour le WAP est indiquée par l'apparition d'une « mimetype wap » dans l'en-tête avant un « html » ou mimetype générique.
Ainsi, un Sony Ericsson W300i a une préférence pour le 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
Et un Blackberry Bold a une préférence pour 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
Depuis que je suis dans la terre Nginx, il semble que le meilleur outil que j'ai des expressions régulières est de Nginx (PCRE).
En ce moment je suis en train d'utiliser un lookahead négatif Affirmer « L'en-tête Accept contient WAP, mais pas par HTML précédée »:
(?!html.*)wap
Mais ce n'est pas correct. Y at-il une autre façon que je peux penser à ce problème? Ou ma logique correspondant?
Jusqu'à présent, j'ai trouvé ces ressources utiles regex:
http://www.regular-expressions.info/completelines.html http://www.zytrax.com/tech/web/regex.htm http://wiki.nginx.org/NginxHttpRewriteModule
Merci!
Merci pour la réponse, voici les essais connexes:
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)
La solution
La façon la plus simple de le faire est avec un regard en arrière au lieu d'un test avant. Puisque non pris en charge, vous pouvez essayer d'imiter un regard en arrière avec un préanalyse:
^(?!(?:(?!wap).)*html).*?wap
Pas agréable à lire, mais il devrait fonctionner.
Autres conseils
Pour behind aspect négatif, et un "micron" plus de performance, peut-être regarder derrière négatif avec correspondance non gourmand:
(?<!html.*?)wap