2010-10-01 70 views
0

我使用NGINX在移动WAP/HTML网站之间划分移动流量。看起来最好的方法是通过检查HTTP Accept Header来检查UA对内容的偏好。正则表达式匹配“wap”前面没有“html”

对WAP的偏好是通过在'html'或通配符mimetype之前的头部中'wap'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 

和BlackBerry大胆对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

谢谢!


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

​​

回答

2

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

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

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

Rubular

+0

我希望:) NGINX使用PCRE不支持可变长度的lookbehind断言:[emerg]:pcre_compile()失败:lookbehind断言在/etc/nginx/nginx.conf中的“(?<!html。*)wap”中的“wap”处不是固定长度:46 – jbox 2010-10-01 23:31:24

+0

@ jbox:我已经更新了我的答案。那对你有用吗? – 2010-10-01 23:36:37

+0

暂时,是的它:) – jbox 2010-10-02 00:20:13

0

背后负的样子,和“微米”更高的性能,与非贪婪匹配后面也许负的样子:

(?<!html.*?)wap