如何使用模式Url从实际Url中提取片段?

时间:2009-08-18 04:37:04

标签: c#

如果我有一系列形式的“模式”网址:

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

我有一个实际的Url形式:

http://joesmith.sitename.com/

有什么方法可以匹配模式Url,然后用它来提取实际Url的用户名部分?我已经想到了讨厌的方法,但似乎应该有更直观的方法来实现这一目标。

ASP.NET MVC使用类似的方法在构建路由时提取URL的各个部分。举个例子:

{controller}/{action}

因此,给定表单的URL Home/Index,它知道它是Home控制器调用Index操作方法。

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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

如您所见,您可能希望略微复杂化正则表达式。例如,您可以将其限制为仅允许子域中的特定数量的字符。

答案 2 :(得分: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;

似乎工作得很好。

答案 3 :(得分:0)

嗯,这个“模式网址”是你编写的格式,对吧?你基本上只需要处理它。

如果格式为:

  • “{}”中的任何内容都是要捕捉的东西,其他一切必须按原样

然后你只需找到这些括号的开始/结束索引,并匹配其他所有内容。然后,当你到达一个地方的地方时,请确保你只查找字符,使它们与下一个结尾'}'之后的“令牌”不匹配。

答案 4 :(得分:0)

肯定有不同的方法 - 最终,您的服务器必须配置为处理(并可能路由)这些不同的子域请求。

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

我使用请求路径,这很容易获得,使用一些简单的字符串解析/正则表达式例程(删除'http://',抓住第一个令牌直到'。'或'/'或'\'等等,然后在会话中使用它,确保观察URL更改。

或者,您可以通过IIS将某些虚拟路径映射到请求网址('joesmith.sitename.com'=>'sitename.com/index.aspx?username=joesmith'),但这也很讨厌。

希望这有帮助!