2010-10-01 48 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