воскресенье, 21 ноября 2010 г.

Разбор в C# URL адреса на составляющие

Вводная: Необходимо было получить адрес сайта из строки вида - http://example.com:8080/viewforum.php?f=1 . То есть разобрать адресную строку на составляющие - для этого можно использовать следующий код (строка задаётся в textbox txtDomain, ответ пишется в txtAnswer) -

    private void button1_Click(object sender, EventArgs e)
    {
      txtAnswer.Text += URL_razbor(txtDomain.Text) + Environment.NewLine + Environment.NewLine;
    }

    private string URL_razbor(string a)
    {
      //Если адрес введён без префикса протокола, то по умолчанию принимаем его как http
      if (a.IndexOf("://") == -1)
      {
        a = "http://" + a;
      }

      try
      {
        System.Uri uri = new System.Uri(a);

        // Получаем порт
        int port = uri.Port;

        // Получаем имя хоста
        string host = uri.Host;

        // Получаем имя протокола
        string protocol = uri.Scheme;

        // Получаем чистый URL 
        string cleanURL = uri.Scheme + "://" + uri.GetComponents(UriComponents.HostAndPort, UriFormat.UriEscaped);

        return "URL - " +a + Environment.NewLine + "Port - " + port.ToString() + ", Host - " + host + ", protocol - " + protocol + ", cleanURL - " + cleanURL;
      }
      catch (UriFormatException)
      {
        return "Адрес " + a + " неверен" + Environment.NewLine;
      }
    }


* This source code was highlighted with Source Code Highlighter.

Данный код выдаст следующие -


URL - http://example.com:8080/viewforum.php?f=1
Port - 8080, Host - example.com, protocol - http, cleanURL - http://example.com:8080


* This source code was highlighted with Source Code Highlighter.

2 комментария:

  1. Почему просто не использовать регулярные выражения?

    ОтветитьУдалить
  2. Потому, что не совсем верно их использовать. К примеру если в ссылке передаётся рефер на другой сайт (к примеру - http://example.com:8080/gosite.php?f=http://example.com:8080/viewforum.php?f=1) , то регулярки либо будут глючить, либо надо дополнительные параметры вводить.
    Плюс много других вопросов возникает - как быть с портом и хостом.

    ОтветитьУдалить