تعبير منتظم لمطابقة معلمة سلسلة استفسارات متعددة / أزواج قيمة

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

  •  23-08-2019
  •  | 
  •  

سؤال

على وشك العمل من خلال هذا واحد، ولكن اعتقد أن شخصا ما قد يكون بالفعل لمعالجة ذلك، لذلك ...

أبحث عن تعبير منتظم أنيق (و ISAPI إعادة كتابة متوافق) للبحث عن ثلاث أزواج معلمة / قيمة معروفة في Querystring، بغض النظر عن الطلب، وكذلك استخراج جميع المعلمات الأخرى أثناء تجريد تلك الثلاثة.

ABC = 123. def = 456. و غياني = 789. كلها معروفة، سلاسل ثابتة. قد تظهر بأي ترتيب في الاستعلام، وقد تكون أو لا تكون أو لا تكون المعلمات الوحيدة، قد تكون مجاورة أو قد تكون مجاورة. يجب أن تكون ذكية ولا تطابقAABC = 123. أو ABC = 123.4 (لذلك يجب أن تكون كل معلمة تم البحث عنها بين قوسين ...،؟، #، أو نهاية السلسلة). الناتج الذي أريده هو سلسلة استفسالية جديدة مع المخارات المتبقية التي تجرها.

ربما سأظل طعنة في المنطق في الصباح، لذلك نقاط المكافأة إذا كنت تستطيع حلها قبل أن أحاول ذلك.

لا يوجد حل صحيح

نصائح أخرى

أعتقد أنه لا ينبغي استخدام Regyxes لمشاكل هذا النوع. فقط قمزج السلسلة، وقارن كل اسم المعلمة إلى ما تبحث عنه.

s/(\?|\#|\&)(abc=123|def=456|ghi=789)(\&|\#|$)//g

هذا تقريبي ومختبر، ولكنه يقدم مفهوم العمل (أعتقد). في الأساس، ابحث عن الحدود، السلسلة الحرفية، ثم حدود الحدود، واستبدال كل منها ب NULL، عالميا، واستخدام | لإعطاء خيارات بديلة لكل منهما.

إليك ما جئت مع:

RewriteRule ^/oldpage.htm\?(.\*)(?<=\?|&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:(?:abc=123|def=456|ghi=789)(?:&|#|$))(.\*) /newpage.htm?$1$2$3  [I,RP,L]

الذي أعتقد أن يعمل. يبدو أن تصفيات Lookahead / Lookbehind، (؟ <= و (؟ =، هي المفتاح للسماح لي بالبحث عن المشمول أو؟ بدون "استهلاكها" لفتاة المباراة التالية.

GotCha واحد هو أنه إذا كان عنوان URL للصفحة القديمة لديه فقط المعالم الثلاثة، ما زلت في نهاية المطاف مع زائدة؟ مع عدم وجود معلمات على عنوان URL المعاد توجيهها، "/NEWPAGE.HTM؟". أنا أخطط حاليا لتجنب ذلك باستخدام ReWriteCond لإلقاء نظرة على عناوين URL فقط مع 4+ بمباراة قبل هذه الحرائق، والحصول على مطابقة أبسط Regex للأشخاص الذين لديهم ثلاثة بالضبط ..

RewriteCond URL ^/oldpage.htm\?([^#]\*=[^#]\*&){3,}[^#]\*=[^#]\*.\*

RewriteRule ^/oldpage.htm\?(.\*)(?<=\?|&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:(?:abc=123|def=456|ghi=789)(?:&|#|$))(.\*) /newpage.htm?$1$2$3  [I,RP,L]

RewriteRule ^/oldpage.htm\?(?:abc=123|def=456|ghi=789)&(?:abc=123|def=456|ghi=789)&(?:abc=123|def=456|ghi=789)(.\*) /newpage.htm$1 [I,RP,L]

(1 دولار في النهاية هو # ساعات إلى عنوان URL ... هل أحتاج إليه حقا؟) المشكلة الأخرى هي أنني أفترض أن عنوان URL من /oldpage.htm؟abc=123&abc=123&abc=123 سيؤدي إلى ذلك، لكنني لا ترى أي طريقة سهلة حول ذلك، وأنا لست قلقا جدا بشأن ذلك ..

هل يمكن لأي شخص أن يفكر في طريقة أفضل للتعامل مع هذا، أو انظر أي مشاكل أخرى؟

هناك محموس الاستعلام. هناك العديد من الموضوعات المتصلة، خاصة في هذا الموقع.

بعضهم.

أولا

ثانيا

و javadocs. حلقة الوصل ل decoder أباتشي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top