我使用NGINX到段移动业务的移动WAP / HTML网站之间。像要做到这一点的最好办法看起来将是通过检查来检查UA的内容偏好的HTTP Accept头。

一个用于WAP优选通过在报头中的“WAP” MIME类型的外观的“HTML”或通配符的mimetype之前指示。

因此,一个索尼爱立信W300i简介具有偏好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

和一个黑莓黑体具有用于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

由于我在NGINX土地是,它似乎是最好的工具,我已经是NGINX的正则表达式(PCRE)。

现在,我试图用一个消极前瞻断言“Accept报头包含WAP但不是由HTML preceeded”:

(?!html.*)wap

但是,这是不正确的。是否有不同的方法,我可以考虑一下这个问题?或我的匹配逻辑?

到目前为止,我发现这些正则表达式资源有用:

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

谢谢!


感谢您的回答,这里有相关的测试:

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)
有帮助吗?

解决方案

要做到这一点的最简单的方法是使用反向预搜索,而不是超前。由于不支持,你可以尝试模仿回顾后具有前瞻:

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

不愉快的阅读,但它应该工作。

Rubular

其他提示

有关负外表后面,和一个“微米”更多的性能,与非贪婪匹配后面也许负外观:

(?<!html.*?)wap
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top