如何从URL检索语言环境(国家/地区)代码?

时间:2015-09-17 17:08:25

标签: c# asp.net

我有一个网址,就像http://example.com/UK/Deal.aspx?id=322

一样

我的目标是删除区域设置(国家/地区)部分,使其像http://example.com/Deal.aspx?id=322

一样

由于网址可能包含其他类似格式:https://ssl.example.com/JP/Deal.aspx?id=735,因此使用“substring”功能不是一个好主意。

我能想到的是使用以下方法将它们分开,然后将它们映射回来。

HttpContext.Current.Request.Url.Scheme
HttpContext.Current.Request.Url.Host
HttpContext.Current.Request.Url.AbsolutePath
HttpContext.Current.Request.Url.Query

并且,假设 HttpContext.Current.Request.Url.AbsolutePath 将是:

/UK/Deal.aspx?id=322  

我不知道如何解决这个问题,因为我的老板让我不要使用“正则表达式”(他认为这会影响性能......)

正则表达式”外,还有其他方法可以从中删除英国吗?

p.s。:英国部分可能是 JP DE 或其他国家/地区代码。

顺便说一句,对于美国,没有国家/地区代码,网址为http://example.com/Deal.aspx?id=322

请同时考虑这种情况。 谢谢。

4 个答案:

答案 0 :(得分:0)

假设您在网址中有TwoLetterCountryISOName。您可以使用UriBuilder课程在不使用Uri的情况下从Regex移除路径。

E.g。

    var originalUri = new Uri("http://example.com/UK/Deal.aspx?id=322");
    if (IsLocaleEnabled(sourceUri))
       {
         var builder = new UriBuilder(sourceUri);
         builder.Path 
          = builder.Path.Replace(sourceUri.Segments[1] /* remove UK/ */, string.Empty);
          // Construct the Uri with new path
          Uri newUri = builder.Uri;;
       }
  

更新

// Cache the instance for performance benefits.
static readonly Regex regex = new Regex(@"^[aA-zZ]{2}\/$", RegexOptions.Compiled);

/// <summary>
/// Regex to check if Url segments have the 2 letter 
/// ISO code as first ocurrance after root
/// </summary>
private bool IsLocaleEnabled(Uri sourceUri)
{
  // Update: Compiled regex are way much faster than using non-compiled regex.
  return regex.IsMatch(sourceUri.Segments[1]);
}

对于性能的好处,您必须将其缓存(意味着将其保留在静态只读字段中)。没有必要在每个请求上解析预定义的正则表达式。通过这种方式,您将获得所有可获得的性能优势。

结果 - http://example.com/Deal.aspx?id=322

答案 1 :(得分:0)

这完全取决于国家代码是否总是具有相同的位置。如果不是,则需要更多关于可能格式的详细信息。也许您可以检查,如果第一个段有两个字符或其他,确保它确实是国家代码(不确定这是否是但是可靠的)。或者,如果文件名始终采用/[optionalCountryCode]/deal.aspx?...

格式,则以文件名开头

这两种方法(字符串级别)如何:

public string RemoveCountryCode()
{
  Uri originalUri = new Uri("http://example.com/UK/Deal.aspx?id=322");
  string hostAndPort = originalUri.GetLeftPart(UriPartial.Authority);

  // v1: if country code is always there, always has same position and always
  // has format 'XX' this is definitely the easiest and fastest
  string trimmedPathAndQuery = originalUri.PathAndQuery.Substring("/XX/".Length);

  // v2: if country code is always there, always has same position but might
  // not have a fixed format (e.g. XXX)
  trimmedPathAndQuery = string.Join("/", originalUri.PathAndQuery.Split('/').Skip(2));

  // in both cases you need to join it with the authority again
  return string.Format("{0}/{1}", hostAndPort, trimmedPathAndQuery);
}

答案 2 :(得分:0)

如果AbsolutePath的格式为/XX/...pagename.aspx?id=###,其中XX是两个字母的国家/地区代码,那么您可以删除前3个字符。

删除前3个字符的示例:

var targetURL = HttpContext.Current.Request.Url.AbsolutePath.Substring(3);

如果国家/地区代码的长度不同,那么您可以找到第二个/字符的索引并从那里开始子字符串。

var sourceURL = HttpContext.Current.Request.Url.AbsolutePath;
var firstOccurance = sourceURL.IndexOf('/')
var secondOccurance = sourceURL.IndexOf('/', firstOccurance);

var targetURL = sourceURL.Substring(secondOccurance);

答案 3 :(得分:0)

简单的方法是将其视为字符串,将其拆分为“/”分隔符,删除第四个元素,然后再次使用“/”分隔符将它们连接起来:

    string myURL = "https://ssl.example.com/JP/Deal.aspx?id=735";
    List<string> myURLsplit = myURL.Split('/').ToList().RemoveAt(3);
    myURL = string.Join("/", myURLsplit);

RESULT: https://ssl.example.com/Deal.aspx?id=735