正则表达式匹配多个查询字符串参数/值对

时间:2009-05-21 21:31:04

标签: regex

关于完成这个工作,但是认为某人可能已经不得不解决它,所以......

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

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

如果你能在我尝试之前解决问题的话,我可能会在早上对这个逻辑进行刺激,所以奖励积分。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

以下是我的想法:

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限定符,(?&lt; =和(?=,似乎是允许我查找包含&amp;或?而不“消耗它”的关键,以便搞砸下一场比赛。

一个问题是,如果旧页面网址只有三个参数,我仍然最终得到一个尾随?在重定向的网址上没有参数,“/ newpage.htm?”。我目前正计划通过使用RewriteCond来避免这种情况,在此触发之前仅查看具有4+ params的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到网址...我真的需要它吗?)另一个问题是我想一个/oldpage.htm?abc=123&abc=123&abc=的网址123会引发这种情况,但我没有看到任何简单的方法,我也不太担心它。

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

答案 2 :(得分:0)

有查询字符串解码器。有许多相关主题,尤其是在本网站上。

其中一些。

First

Second

javadocs link用于apache解码器。

答案 3 :(得分:0)

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

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