【问题标题】:Regular Expression to match multiple query string parameter/value pairs正则表达式匹配多个查询字符串参数/值对
【发布时间】:2011-11-25 18:20:33
【问题描述】:

即将解决这个问题,但认为有人可能已经不得不解决它,所以......

我正在寻找一个优雅(并且兼容 isapi 重写)的正则表达式,以在查询字符串中查找三个已知的参数/值对,无论顺序如何,并在去除这三个参数的同时提取所有其他参数。

abc=123 def=456ghi=789 都是已知的固定字符串。它们可能以任何顺序出现在查询字符串中,可能是也可能不是唯一的参数,可能是相邻的,也可能不是相邻的。它应该是智能的,并且不匹配 aaabc=123abc=1234(因此每个搜索的参数都应该用 &、?、# 或字符串结尾括起来) .我想要的输出是一个新的查询字符串,其中剩余的参数被去掉了。

我可能会在早上尝试一下逻辑,所以如果你能在我尝试之前解决它,那么可以加分。

【问题讨论】:

    标签: regex


    【解决方案1】:

    我认为正则表达式不应该用于此类问题。只需对字符串进行标记,并将每个参数的名称与您要查找的名称进行比较。

    【讨论】:

    • 当然,这就是我在其他地方的做法,但我正在寻找可以插入重写规则的东西(具体来说是 isapi rewrite2)。
    • 主题旁边的问题:如果参数名称未知、值未知且值可能包含任何字符以及=&,如何进行标记化?
    【解决方案2】:
    s/(\?|\#|\&)(abc=123|def=456|ghi=789)(\&|\#|$)//g
    

    这是近似且未经测试的,但提出了一个可行的(我认为)概念。基本上,查找起始边框、文字字符串,然后是结束边框,将每个边框替换为 null、全局并使用 |为每个选项提供替代选项。

    【讨论】:

    • 如果两个字符串彼此相邻,这将不起作用,因为 & 会重叠。
    【解决方案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]
    

    我认为可行。 lookAhead/lookbehind 限定符 (?

    一个问题是,如果旧页面 url 只有三个参数,我仍然会得到一个尾随 ?重定向的 url 上没有参数,“/newpage.htm?”。我目前正计划通过使用 RewriteCond 在触发之前只查看具有 4 个以上参数的 url 来避免这种情况,并为恰好具有 3 个参数的 URL 提供更简单的匹配正则表达式。所以完整的规则集如下:

    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 用于 #additions 到 url...我真的需要它吗?)另一个问题是我想 /oldpage.htm?abc=123&abc=123&abc=123 的 url 会触发这个,但我没有看到任何简单的解决方法,也不太担心..

    谁能想到一个更好的方法来解决这个问题,或者看到任何其他问题?

    【讨论】:

      【解决方案4】:

      有查询字符串解码器。有很多相关的主题,尤其是在这个网站上。

      其中一些。

      First

      Second

      还有 javadocs link 用于 apache 解码器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多