【发布时间】:2015-12-04 21:15:44
【问题描述】:
我正在开发一个包含多个翻译的 MVC 站点。我们希望通过 http://en.domain.com 或 http://fr.domain.com 等子域来实现这一目标。我们还希望支持常规域http://domain.com。
如果您手动更改子域,则翻译工作正常,但我正在寻找一种方法来自动执行此操作并维护整个当前 URL,以允许找到 http://en.domain.com/product 的用户单击链接并获取另一个语言版本同一页的。将子域(如果存在)隔离,将其从当前 url 中剥离,并替换为指定的语言版本似乎很简单。
本质上:
http://en.domain.com/product(原创)
http://domain.com/product(已清理)
http://fr.domain.com/product 或 http://de.domain.com/product 等...(输出)
我开始寻找像 Request.Url.Subdomain 这样的内置功能,但得出的结论是没有这样的神奇生物。然后我继续进行基本的字符串操作,但它似乎真的很令人困惑,所以我开始寻找一个正则表达式的解决方案。
我已经使用一些通常为我工作的在线正则表达式测试器测试了这个正则表达式,并且他们在子域存在时正确识别它,但在代码实际运行时找不到结果。
我只使用了一点正则表达式,我希望这里有一些非常明显的地方我做错了。如果有更好的解决方案,我愿意接受其他方面的建议。
C#
string url = Request.Url.AbsoluteUri; //http://en.domain.com/
Regex regex = new Regex(@"/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/", RegexOptions.IgnoreCase);
GroupCollection results = regex.Match(url).Groups;
Group result = results[0];
这是我目前的解决方案。没有我想要的那么优雅,但是对于一些消耗太多时间的东西,它现在可以按预期工作了。
查看
<a href="@Html.Action("ChangeLanguage", new { lang = "en" })">English</a>
<a href="@Html.Action("ChangeLanguage", new { lang = "fr" })">French</a>
动作
public string ChangeLanguage(string controller, string lang)
{
string url = Request.Url.AbsoluteUri;
Regex regex = new Regex(@"(?:https*://)?.*?\.(?=[^/]*\..{2,5})", RegexOptions.IgnoreCase);
GroupCollection results = regex.Match(url).Groups;
Group result = results[0];
if (result.Success)
{
string[] resultParts = result.Value.Split('/');
string newSubDomain = resultParts[0] + "//" + lang + ".";
url = url.Replace(result.Value, newSubDomain);
}
else
{
string[] urlParts = url.Split('/');
string oldParts = urlParts[0] + "//";
string newParts = urlParts[0] + "//" + lang + ".";
url = url.Replace(oldParts, newParts);
}
return url;
}
【问题讨论】:
-
显而易见的事情:C# 中不需要正则表达式分隔符。试试
@"(?:https*://)?.*?\.(?=[^/]*\..{2,5})。 -
您是否考虑过使用子域以外的东西?
http://domain.com/fr/product也同样有效,并且不需要将每个新的“翻译”都注册为 DNS 条目。 -
@stribizhev 就是这样。我不是 100% 确定为什么中间部分有效,但似乎来自测试。
-
我们过去使用过
domain.com/en/etc...,它带来了另一组复杂性,因此我们想探索一些其他选择。 -
@Locke125:DVK 的回答对你有用吗?它看起来更干净。
标签: c# regex asp.net-mvc