C# 如何使用模式Url从实际Url提取段?

C# 如何使用模式Url从实际Url提取段?,c#,C#,如果我有一系列形式的“模式”URL: http://{username}.sitename.com/ http://{username}.othersite.net/ http://mysite.com/{username} http://joesmith.sitename.com/ 我有一个表单的实际Url: http://{username}.sitename.com/ http://{username}.othersite.net/ http://mysite.com/{usernam

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

http://{username}.sitename.com/
http://{username}.othersite.net/
http://mysite.com/{username}
http://joesmith.sitename.com/
我有一个表单的实际Url:

http://{username}.sitename.com/
http://{username}.othersite.net/
http://mysite.com/{username}
http://joesmith.sitename.com/
有没有什么方法可以匹配一个模式Url,然后使用它从实际Url中提取用户名部分?我已经想到了一些糟糕的方法,但似乎应该有一种更直观的方法来实现这一点

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

{controller}/{action}
因此,给定表单的Url,
Home/Index
,它知道是主控制器调用索引操作方法。

这个“模式Url”是您编写的格式,对吗?你基本上只需要处理它

如果其格式为:

  • “{}”中的任何内容都需要捕获,其他所有内容都必须保持原样
然后您只需找到这些括号的开始/结束索引,并匹配其他所有内容。然后,当你到达一个地方时,确保你只查找字符,这样它们就不会匹配下一个结尾“}”后面的任何“标记”。

这个“模式URL”是你自己编的格式,对吗?你基本上只需要处理它

如果其格式为:

  • “{}”中的任何内容都需要捕获,其他所有内容都必须保持原样

然后您只需找到这些括号的开始/结束索引,并匹配其他所有内容。然后当你到了一个地方,确保只查找字符,使其与下一个结尾“}”之后的任何“标记”都不匹配。

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

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

一个非常简单的正则表达式可以:

':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

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

一个非常简单的正则表达式可以:

':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

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

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

我要做的是用一个处理程序或页面来回答sitename.com上的所有子域请求(可能除了一些保留字,如“www”、“mail”等)(我假设ASP.NET基于您的C#标记)

我将使用请求路径,这很容易获得,并使用一些简单的字符串解析/regex例程(删除“http://”,获取第一个令牌直到“.”或“/”或“\”,等等),然后在会话中使用该路径,确保观察URL更改

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


希望这有帮助

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

我要做的是用一个处理程序或页面来回答sitename.com上的所有子域请求(可能除了一些保留字,如“www”、“mail”等)(我假设ASP.NET基于您的C#标记)

我将使用请求路径,这很容易获得,并使用一些简单的字符串解析/regex例程(删除“http://”,获取第一个令牌直到“.”或“/”或“\”,等等),然后在会话中使用该路径,确保观察URL更改

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


希望这有帮助

似乎最快、最简单的解决办法就是脱离机器的答案

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;

似乎效果很好。

似乎最快、最简单的解决方案是脱离机器的答案

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;

似乎效果很好。

我认为用户名字符串周围不会有括号。嗯,我说的是模式。不是要匹配的东西。我不认为用户名字符串周围会有括号。嗯,我说的是模式。不是要匹配的东西,很好。我对这个问题作了修改。模式URL可以是不同的格式。只是澄清一下-对于这样的URL应该发生什么:好的观点。我对这个问题作了修改。模式URL可以是不同的格式。只是澄清一下-对于这样的URL应该发生什么: