سؤال

أنا أستخدم NGINX لتصنيف حركة الهاتف المحمول بين موقع WAP/HTML المحمول. يبدو أن أفضل طريقة للقيام بذلك هي التحقق من تفضيل UA للمحتوى عن طريق التحقق من رأس HTTP قبول.

يشار إلى تفضيل WAP من خلال ظهور mimetype "wap" في الرأس قبل "html" أو محاكاة البدل.

لذلك لدى 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 Land ، يبدو أن أفضل أداة لدي هي تعبيرات Nginx العادية (PCRE).

الآن أحاول استخدام Lookahead سلبي لتأكيد "رأس قبول يحتوي على WAP ولكن لا يسبقه HTML":

(?!html.*)wap

لكن هذا غير صحيح. هل هناك طريقة مختلفة يمكنني التفكير في هذه المشكلة؟ أو منطق المطابقة الخاص بي؟

حتى الآن وجدت موارد regex مفيدة:

http://www.regular-expressions.info/completelines.htmlhttp://www.zytrax.com/tech/web/regex.htmhttp://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)
هل كانت مفيدة؟

المحلول

أبسط طريقة للقيام بذلك هي مع lookbehind بدلا من lookahead. نظرًا لأن هذا غير مدعوم ، يمكنك محاولة محاكاة lookbehind مع lookahead:

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

ليس لطيفا للقراءة ، ولكن يجب أن تعمل.

قاذف

نصائح أخرى

للمظهر السلبي وراءه ، وأداء "ميكرون" أكثر ، ربما يكون نظرة سلبية مع مطابقة غير غريدي:

(?<!html.*?)wap
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top