正则表达式匹配字母数字,除正向斜杠之外的URL运算符

时间:2013-03-11 10:28:19

标签: regex url-rewriting

过去几个小时我一直试图让这个正则表达式正确但不幸的是,我仍然无法得到它。尝试搜索现有的线程,但没有骰子。 :(

我想要一个正则表达式来匹配以下可能的字符串:

userprofile?id=123
profile
search?type=player&gender=male
someotherpage.htm

但不是

userprofile/
helloworld/123

基本上,我希望正则表达式匹配字母数字网址运算符,例如?,=和& ,但不要正斜线。 (即只要字符串包含正斜杠,正则表达式就应该返回0匹配。)

我尝试了以下正则表达式,但似乎没有效果:

([0-9a-z?=.]+)
(^[^\/]*$[0-9a-z?=.]+)
([0-9a-z?=.][^\/]+)
([0-9a-z?=.][\/$]+)

任何帮助将不胜感激。非常感谢你!

2 个答案:

答案 0 :(得分:0)

这应该可以解决问题:

/\w+(\.htm|\?\w+=\w*(&\w+=\w*)*)?$/i

要解决这个问题:

\w+              // Match [a-z0-9_] (1 or more), to specify resource
  (              // Alternation group (i.e., a OR b)
    \.htm        // Match ".htm"
    |            // OR
    \?           // Match "?"
    \w+=\w*      // Match first term of query string (e.g., something=foo)
    (&\w+=\w*)*  // Match remaining terms of query string (zero or more)
  )
?                // Make alternation group optional
$                // Anchor to end of string

i标志用于不区分大小写。

答案 1 :(得分:0)

它们全部匹配的原因是你的正则表达式匹配字符串的一部分而你没有告诉它需要匹配整个字符串。您需要确保它不允许字符串中的任何其他字符,例如

^[0-9a-z&?=.]+$

这是一个小的perl脚本来测试它:

#!/usr/bin/perl

my @testlines = (
         "userprofile?id=123",
         "userprofile",
         "userprofile?type=player&gender=male",
         "userprofile.htm",
         "userprofile/",
         "userprofile/123",
        );

foreach my $testline(@testlines) {
  if ($testline =~ /^[0-9a-z&?=.]+$/) {
    print "$testline matches\n";
  } else {
    print "$testline doesn't match - bad regexp, no cookie\n";
  }
}