Регулярное выражение для соответствия «wap», которому не предшествует «html» - PullRequest
0 голосов
/ 02 октября 2010

Я использую NGINX для сегментирования мобильного трафика между мобильным WAP / HTML-сайтом.Похоже, что лучший способ сделать это - проверить предпочтения UA для контента, проверив заголовок HTTP Accept.

Предпочтение для WAP указывается появлением в заголовке mimetype «wap».перед 'html' или подстановочным символом Mimetype.

Таким образом, Sony Ericsson 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 Bold предпочитает 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).

Сейчас я пытаюсь использовать отрицательный взгляд, чтобы утверждать: "Принятьзаголовок содержит WAP, но не предшествует HTML ":

(?!html.*)wap

Но это не правильно.Есть ли другой способ думать об этой проблеме?Или моя логика сопоставления?

До сих пор я находил полезными следующие ресурсы регулярных выражений:

http://www.regular -expressions.info / completetelines.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)

Ответы [ 2 ]

2 голосов
/ 02 октября 2010

Самый простой способ сделать это - смотреть назад, а не смотреть вперед. Так как это не поддерживается, вы можете попытаться эмулировать взгляд с предвидением:

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

Не приятно читать, но должно работать.

Rubular

0 голосов
/ 02 октября 2010

Для негативного взгляда и увеличения производительности на «микрон», возможно, негативного взгляда с не жадным соответствием:

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