2015-09-17 2 views
-1

У меня есть URL-адрес, который, как http://example.com/UK/Deal.aspx?id=322Как получить код региона (страны) по URL-адресу?

Моя цель заключается в удалении локали (страна) часть, чтобы сделать его как http://example.com/Deal.aspx?id=322

Поскольку URL может иметь и другие подобные форматы, такие как: 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 

Я не знаю, как справиться с этим, так как мой босс попросил меня не использовать «обычный выражение "(он думает, что это будет влиять на производительность ...)

Кроме" Regular Expression», есть ли другой способ, чтобы удалить UK от этого?

p.s .: UK часть может быть JP, DE или другой код страны.

Кстати, для США, нет кода страны, и URL будет http://example.com/Deal.aspx?id=322

Пожалуйста, также эту ситуацию во внимание. Спасибо.

+1

Почему вы хотите удалить и отобразить их обратно? Является ли это из-за того, что локаль автоматически добавляется к вам? При обращении к веб-сайту из разных регионов или стран? если да, то может быть другое решение. – vendettamit

+1

Привет @vendettamit, на самом деле мой сайт добавляет «много регионов» в наши дни, а мои унаследованные URL-адреса не будут работать правильно, если есть дополнительный «код страны». Я пытаюсь удалить «код страны» с URL-адреса (с кодом страны), прежде чем перейти к этим унаследованным методам и отобразить его обратно после обработки. – user3174976

+0

Gotach !! Вы можете использовать небольшое регулярное выражение для соответствия, если сегмент Url имеет 2-буквенный ISO-код в качестве первого ввода после root. @ user3174976 См. мой обновленный ответ. – vendettamit

ответ

0

Предполагая, что у вас будет TwoLetterCountryISOName по адресу. yВы можете использовать класс 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;; 
     } 

Update:

// 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

+0

Привет @vendettamit, если мой URL-адрес http://example.com/Deal.aspx?id=322 для США (без кода страны), есть ли способ игнорировать ваш метод замещения в этом sitaution? Спасибо. – user3174976

+0

hmm !! вам понадобится дополнительная проверка verfiy, если у URL-адреса указан код страны. – vendettamit

+0

Когда вы инициализируете свой строитель, вам также необходимо указать начальный путь. В противном случае по умолчанию используется URI loopback, а затем ваша замена ничего не делает. – AgapwIesu

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); 
} 
0

Если AbsolutePath всегда будет иметь формат /XX/...pagename.aspx?id=### где XX это два буквенный код страны, то вы можете просто удалить первые три символа.

Пример, который удаляет первые 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); 
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 
Смежные вопросы