我有一个网址,就像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
请同时考虑这种情况。 谢谢。
答案 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