Регулярное выражение для соответствия «WAP» не предшествует «HTML»

StackOverflow https://stackoverflow.com/questions/3843596

Вопрос

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

Предпочтение WAP указывается появлением «WAP» Mimetype в заголовке перед «HTML» или WildCard 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

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

До сих пор я нашел эти ресурсы Regex Reales:

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

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

Репутация

Другие советы

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

(?<!html.*?)wap
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top