如果我有一系列形式的“模式”网址:
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操作方法。
答案 0 :(得分:1)
我不确定我是否正确理解了这个问题,但你可以使用正则表达式匹配'http://'和第一个点之间的任何内容。
答案 1 :(得分:1)
一个非常简单的正则表达式将会:
':https?://([a-z0-9\.-]*[a-z0-9])\.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'),但这也很讨厌。
希望这有帮助!