2010-10-01 4 views
0

J'utilise NGINX pour segmenter le trafic mobile entre un site WAP/HTML mobile. On dirait que la meilleure façon de le faire sera de vérifier la préférence de l'UA pour le contenu en vérifiant l'en-tête HTTP Accept.Expression régulière correspondant à "wap" non précédée de "html"

Une préférence pour le protocole WAP est indiquée par l'apparition d'un type MIME "wap" dans l'en-tête avant un type "html" ou un type MIME 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 le 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 est les expressions régulières de NGINX (PCRE).

En ce moment je suis en train d'utiliser un négatif pour affirmer préanalyse « L'en-tête accepter contient WAP, mais pas par HTML précédée »:

(?!html.*)wap 

Mais ce n'est pas correct. Y a-t-il une façon différente de penser à ce problème? Ou ma logique correspondante?

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 tests relatifs:

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) 

Répondre

2

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 regard en avant:

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

Pas agréable à lire, mais il devrait fonctionner.

Rubular

+0

Je souhaite :) NGINX utilise PCRE qui ne supporte pas assertions lookbehind de longueur variable: [emerg]: pcre_compile() a échoué: lookbehind assertion n'est pas fixe longueur dans "(? jbox

+0

@ jbox: J'ai mis à jour ma réponse. Est-ce que ça marche pour toi? –

+0

Tentative, oui c'est le cas :) – jbox

0

Pour regard négatif derrière, et un "micron" plus de performance, peut-être regarder derrière négatif avec correspondance non gourmand:

(?<!html.*?)wap 
Questions connexes