2009-08-18 16 views
0

如果我有一系列的形式的“模式”的url:如何使用模式地址从一个实际的URL截取其中一部分?

http://{username}.sitename.com/ 
http://{username}.othersite.net/ 
http://mysite.com/{username} 

,我有以下形式的实际地址:

http://joesmith.sitename.com/ 

有什么办法,我可以匹配模式网址并反过来用它来提取用户名部分出实际的网址是什么?我想过讨厌的方式来做到这一点,但它只是好像应该是做到这一点更直观的方式。

ASP.NET MVC使用类似的方法时,它正在建设它的路线来提取URL的各个环节。给出的例子:

{controller}/{action} 

所以给出的形式,Home/Index的URL,它知道它是家庭控制器调用索引操作方法。

回答

1

这似乎是最快最简单的解决方案是从机器的答案。

var givenUri = "http://joesmith.sitename.com/"; 
var patternUri = "http://{username}.sitename.com/"; 
patternUri = patternUri.Replace("{username}", @"([a-z0-9\.-]*[a-z0-9]"); 

var result = Regex.Match(givenUri, patternUri, RegexOptions.IgnoreCase).Groups; 

if(!String.IsNullOrEmpty(result[1].Value)) 
    return result[1].Value; 

似乎很好。

0

那么,这个“模式网址”是你做了一个格式的,对不对?你基本上只需要处理它。

如果它的格式是:

  • 东西里面的“{}”是捕捉到的事情,一切必须是是

然后,你只要找到启动/结束这些括号的指数,并匹配一切。然后,当你到达某个地方时,确保只查找字符,以使它们与下一个结尾“}”之后的任何“标记”不匹配。

+0

我不认为会有用户名字符串周围的括号。 – rahul 2009-08-18 04:46:47

+0

恩,我在谈论这个模式。不是匹配的东西。 – 2009-08-18 04:52:29

1

不确定我是否正确理解此问题,但您可以使用正则表达式来匹配'http://'和第一个点之间的任何内容。

+1

好点。我对这个问题进行了编辑。模式Url可以具有不同的格式。 – user135383 2009-08-18 04:48:55

+0

只是为了澄清 - 像这样的URL会发生什么情况: http://joesmith.sitename.com/janesmith – DmitryK 2009-08-18 04:56:09

1

一个非常简单的正则表达式会做:

':https?://([a-z0-9\.-]*[a-z0-9])\.sitename\.com' 

这将允许只包含有效的子域字符的任意子域。允许子域的例子:

  • joesmith.sitename.com
  • joe.smith.sitename.com
  • joe-smith.sitename.com
  • a-very-long-subdomain.sitename.com

正如您所看到的,您可能需要稍微复杂一些正则表达式。例如,您可以将其限制为只允许子域中的一定数量的字符。

0

有绝对不同的方式 - 最终虽然您的服务器必须配置为处理(并可能路由)这些不同的子域请求。

我会做的是在sitename.com上用单个处理程序或页面回答所有子域请求(除了可能是一些保留字,例如'www','邮件'等)(我假设ASP .NET在这里基于你的C#标签)。

我想用一些简单的字符串解析/正则表达式例程(删除'http://',抓住第一个标记直到'。'或'/')来使用请求路径,或'\'等),然后在会话中使用它,确保观察URL更改。或者,您可以通过IIS映射某些虚拟路径来请求网址('joesmith.sitename.com'=>'sitename.com/index.aspx?username=joesmith'),但这也是一种讨厌的东西。

希望这会有所帮助!