【问题标题】:regular expression to parse short urls解析短网址的正则表达式
【发布时间】:2009-06-28 17:46:56
【问题描述】:

我的网站上有一个可能的网址列表,例如
1 http://dev.site.com/People/
2 http://dev.site.com/People
3 http://dev.site.com/Groups/
4 http://dev.site.com/Groups
5 http://dev.site.com/
6 http://dev.site.com/[extraword]

我希望能够匹配所有像 6 这样的 url 并将它们重定向到
http://dev.site.com/?Shorturl=extraword

但我不想重定向前 5 个网址

我尝试了类似
((.*)(?!人物|群组))\r

但出了点问题。
有什么帮助吗? 谢谢

【问题讨论】:

  • 这是为了 mod_rewrite 还是别的什么?

标签: regex short-url


【解决方案1】:

您应该在开头检查它不是PeopleGroups

(?!People|Groups)(.*)

目前您正在检查正则表达式后面是否没有 PeopleGroups

根据您使用的语言/框架,您可能还需要使用^$ 来确保匹配整个字符串:

^(?!People|Groups)(.*)$

您还应该考虑是否要匹配以People 开头的网址,例如。 http://dev.site.com/People2/。所以这可能会更好:

^(?!(?:People|Groups)(?:/|$))(.*)$

它会检查对 PeopleGroups 的否定匹配是否跟在 URL 的末尾或斜杠之后。

您可能需要确保不匹配空字符串,因此请使用.+ 而不是.*

^(?!(?:People|Groups)(?:/|$))(.+)$

如果你想要一个不带任何斜线的单词:

^(?!(?:People|Groups)(?:/|$))([^/]+)$

【讨论】:

  • 我已经尝试了你所有的例子(在 C# 中),但它们都不起作用 - 它们都导致所有字符串匹配:/
  • 我认为他只是匹配 URL 的路径部分。
【解决方案2】:

在您的正则表达式中,(.*) 子模式消耗整个字符串,然后导致负前瞻成功。

您需要一个否定的前瞻来排除 People|Groups,然后您需要捕获额外的单词(并且该单词需要包含一些内容,否则我们希望匹配失败)。这里的关键部分是负前瞻不会消耗任何字符串,因此您可以捕获额外的单词以供后续在您尝试构建的重定向 URL 中使用。

这是 Perl 中的一个解决方案,但该方法在 C# 中应该适用于您:

use warnings;
use strict;

while (<DATA>){
    print "URL=$1  EXTRA_WORD=$2\n"
        if /^(.*)\/(?!People|Groups)(\w+)\/?$/;
}

__DATA__
http://dev.site.com/People/
http://dev.site.com/People
http://dev.site.com/Groups/
http://dev.site.com/Groups
http://dev.site.com/
http://dev.site.com/extraword1
http://dev.site.com/extraword2/

输出:

URL=http://dev.site.com  EXTRA_WORD=extraword1
URL=http://dev.site.com  EXTRA_WORD=extraword2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    相关资源
    最近更新 更多