Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2013, 15:32   #11
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
просто что именно надо ТСу?
Необходим не столь широкий разбор, только:
схема/протокол, хост, путь, параметры запроса
Разобрать в ручную не так уж и сложно, но перед тем, как писать этот код, решил спросить про функцию, чтобы не изобретать велосипед

Последний раз редактировалось Tahoma; 17.12.2013 в 15:35.
Tahoma вне форума Ответить с цитированием
Старый 17.12.2013, 17:02   #12
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от Tahoma Посмотреть сообщение
Разобрать в ручную не так уж и сложно
Мне лично было бы интересно глянуть на результат.
Кстати, упомянутые элементы - это то, что нужно извлечь, или то, что допустимо в строке?
waleri вне форума Ответить с цитированием
Старый 17.12.2013, 18:32   #13
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Мне лично было бы интересно глянуть на результат.
Кстати, упомянутые элементы - это то, что нужно извлечь, или то, что допустимо в строке?
Это те элементы, которые необходимо извлечь для моей библиотеки. Но думаю стоит написать полный обработчик URL для архива, лишним в запасе не будет.

Появятся исходники - выложу, хотя бы для помощи в оптимизации.
Tahoma вне форума Ответить с цитированием
Старый 17.12.2013, 22:16   #14
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию

Вот накидал кое-какой код:

Код:
bool t_web_splitcpy(char* in, char* out, int* step, char* check, bool isFullCopy = true)
{
   char* next_line = in;
   int Step = step[0];
   
   if ( (next_line = strstr(in + Step, check)) != NULL) {
     memcpy(out, in + Step, next_line - (in + Step));
     out[next_line - (in + Step)] = 0;
     next_line += strlen(check);
     step[0] += next_line - (in + Step);
     return true;
   }
   else if (isFullCopy) {     
     memcpy(out, in + Step, strlen(in) - Step);
     out[strlen(in) - Step] = 0;
   }
   
   return false;
}

void t_web_spliturl(char* url, char* protocol, char* host, int* port, char* path, char* params)
{
   int step = 0;
   char* next_line = url;
   bool endline = false;
   
   // Записываем конец строки, т.к. буферы могут быть переданы не очищенными
   protocol[0] = 0;
   host[0] = 0;
   path[0] = 0;
   params[0] = 0;
   port[0] = 80;
   
   //!!!!! добавить перевод URL в нижний регистр
   
   // URL был передан пустой? Выход
   if (strlen(url) == 0)
      return;
   
   ////
   // Выделяем протокол из всего URL
   ////
   t_web_splitcpy(url, protocol, &step, "://", false);
 
   ////
   // Выделяем хост из всего URL
   ////
   if (!(t_web_splitcpy(url, host, &step, "/")))
     endline = true;
     
   ////
   // Выделяем порт из хоста
   ////
   if ( (next_line = strstr(host, ":")) != NULL)
   {
      port[0] = atoi(next_line + 1);
      host[next_line - host] = 0;
      
      // !!!!! тут можно сделать автоподстановку протокола на основании номера порта, 
      // !!!!! но думаю это лишнее
   }
   
   // !!!!! можно добавить выделение логина из хоста (н-р: root@mysite)
   
   if (endline)
     return;
   
   ///
   // Выделяем путь из URL
   ///
   if (!(t_web_splitcpy(url, path, &step, "?")))
     return;
  
   ///
   // Выделяем параметры из URL
   /// 
   memcpy(params, url + step, strlen(url) - step);
   params[strlen(url) - step] = 0;
}


char* t_web_splitparams(char* original_buf, char* buf, char* name, char* key)
{
   name[0] = 0;
   key[0] = 0;
   
   char* in = buf;
   char* step;
   char out[512]; // !!!!! надо избавиться от явного определения емкости буфера   

   // Выделяем %s=%s
   if (strlen(original_buf) <= in - original_buf)
     return NULL;
   
   if ( (buf = strstr(in, "&")) != NULL) {
     memcpy(out, in, buf - in);
     out[buf - in] = 0;
     ++buf;
   }
   else
   {
     memcpy(out, in, strlen(in));
     out[strlen(in)] = 0;
     buf = original_buf + strlen(original_buf);
   }
     
   // Разбиваем на name и key
   if ( (step = strstr(out, "=")) != NULL) {
     memcpy(name, out, step-out);
     name[step-out] = 0;
     memcpy(key, out + (step-out+1), strlen(out) - (step-out+1));
     key[strlen(out) - (step-out+1)] = 0;
   }  
   else
   {
     strcpy(name, out);
   }  
   
   return buf;
}
Проверка:
Код:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
   char	test1[] = "https://www.google.ru:8080/search?q=_splitpath&oq=_spl&aqs=chrome.1.69i57j0l3.2173j0j1&sourceid=chrome&ie=UTF-8";
   char test2[] = "www.google.ru";
   char test3[] = "www.google.ru:8080";
   char test4[] = "ftp://google.ru:9090/";
   
   char* testurl = test1;  // сюда подставляется тестовый URL (чтобы ниже не править)
   
   char protocol[16];
   char host[256];
   char path[256];
   char params[512];
   int port;
   
   t_web_spliturl(testurl, protocol, host, &port, path, params); 
   
   printf("\n\nTest URL: %s\n\n", testurl);
   printf("Protocol: %s\n", protocol);
   printf("Host: %s\n", host);
   printf("Port: %d\n", port);
   printf("Path: %s\n", path);
   printf("Params: %s\n", params);
   
   char name[256];
   char key[256];
   char* next_param = params;
   
   printf("\n\nSplit params:\n");
   
   if (strlen(params) != 0)
   {
     while( (next_param = t_web_splitparams(params, next_param, name, key)) != NULL)
     {
       printf("%s = %s\n", name, key);
     }
   }
   
   return 0;
}
На работе нет винды под рукой с VS. Тестил на федоре.
Жду критику и предложения.

Последний раз редактировалось Tahoma; 18.12.2013 в 02:47. Причина: забыл вставить функцию t_web_splitparams
Tahoma вне форума Ответить с цитированием
Старый 18.12.2013, 09:50   #15
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

waleri вне форума Ответить с цитированием
Старый 18.12.2013, 12:14   #16
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
: port - это так и пишется? Просто номер порта у меня обрабатывается.
На счет user: pass, в коде есть такая пометка, как:
Код:
// !!!!! можно добавить выделение логина из хоста (н-р: root@mysite)
А вот на счет mailto, думаю надо просто добавить ещё обработчик для протокола, если это конечно один такой пример без // в конце.

Последний раз редактировалось Tahoma; 18.12.2013 в 12:17.
Tahoma вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
макрос жеребьёвки, разбиения на пары 1945zxc Microsoft Office Excel 21 03.11.2018 21:32
Процедура разбиения на слова Lichnost3d Общие вопросы Delphi 4 01.11.2011 06:33
Ошибка разбиения ячеек в Word KiSH333 Общие вопросы Delphi 0 02.04.2009 10:02
функция: копирование части строки в другую строку plasticman Microsoft Office Excel 1 18.03.2009 15:30