C# 如何使用模式Url从实际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
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”是您编写的格式,对吗?你基本上只需要处理它
如果其格式为:
- “{}”中的任何内容都需要捕获,其他所有内容都必须保持原样
- “{}”中的任何内容都需要捕获,其他所有内容都必须保持原样
然后您只需找到这些括号的开始/结束索引,并匹配其他所有内容。然后当你到了一个地方,确保只查找字符,使其与下一个结尾“}”之后的任何“标记”都不匹配。不确定我是否正确理解此问题,但可以使用正则表达式匹配“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应该发生什么: