2010-06-18 2 views
0

В настоящее время я вношу несколько изменений в источник rTorrent. У меня есть следующий код:Как я могу извлечь домен из URL?

torrent::Object 
apply_to_domain(const torrent::Object& rawArgs) { 

const char * url = rawArgs.as_string().c_str(); 
char buffer[50]; 
snprintf(buffer, 50, "URL: %s.", url); 

    return std::string(buffer); 
} 

Мне нужно извлечь домен из URL. Есть источник regex.h, включенный в источник, но я не уверен, могу ли я использовать это или мне нужно использовать другую библиотеку регулярных выражений.

Link to regex.h

ответ

4

Единственное, что «регулярное выражение» реализация обрабатывает это символ подстановки, *. (Кстати, я просто предполагаю, что это подстановочный знак, поскольку это единственный признанный признак, и комментарии, похоже, намекают так же, но я на самом деле не проверял его.)

Используйте правильную библиотеку регулярных выражений, такую ​​как Boost.Regex.

1

// Это взломанная целая цепочка соответствие шаблону. Заменить на
// Регулярное выражение TR1, когда это становится широко распространенным . Предназначен для
// маленький строки.

Это не сработает для извлечения домена. Используйте вместо этого Boost или VSCRT TR1.

0

В окнах:

#include <winsock2.h> 
#include <windows.h> 
#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 
#include <cctype> 
#include <locale> 
#pragma comment(lib,"ws2_32.lib") 
using namespace std; 

string website_HTML; 
locale local; 

//*************************** 
void get_Website(char *url); 
void extract_URL(); 
//*************************** 


int main() 
{ 
    char *url="www.bbc.com"; 
    get_Website(url); 
    extract_URL(); 

    return 0; 
} 



//*************************** 
void get_Website(char *url) 
{ 
     WSADATA wsaData; 
     SOCKET Socket; 
     SOCKADDR_IN SockAddr; 


     int lineCount=0; 
     int rowCount=0; 

     struct hostent *host; 
     char *get_http= new char[256]; 

     memset(get_http,' ', sizeof(get_http)); 
     strcpy(get_http,"GET/HTTP/1.1\r\nHost: "); 
     strcat(get_http,url); 
     strcat(get_http,"\r\nConnection: close\r\n\r\n"); 

     if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) 
     { 
      cout << "WSAStartup failed.\n"; 
      exit(0); 
     } 

     Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
     host = gethostbyname(url); 

     SockAddr.sin_port=htons(80); 
     SockAddr.sin_family=AF_INET; 
     SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr); 

     cout << "Connecting to ["<< url<<"]...\n"; 
     if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0) 
     { 
      cout << "Could not connect\n"; 
      exit(0); 
     } 
     cout << "Connected. (success!)\n"; 
     std::cout << std::flush; 
     send(Socket,get_http, strlen(get_http),0);  
     char buffer[10000]; 
     int nDataLength; 
     int i = 0; 

     while ((nDataLength = recv(Socket,buffer,10000,0)) > 0) 
     {  


      while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') 
      {  
       website_HTML+=buffer[i];     
       i += 1; 

      } 

     } 
     cout<<"\n"<<i<<" bytes downloaded \n\n"; 
     closesocket(Socket); 
     WSACleanup(); 
     delete[] get_http; 
} 


void extract_URL() 
{ 
    for (size_t i=0; i<website_HTML.length(); ++i) website_HTML[i]= tolower(website_HTML[i],local); 

    std::string to_find = "http:"; 
    std::vector<string> extracted_website_URL; 
    std::string string_to_split; 
    char chr_String[1000]; 
    int count = 0; 
    char seps[] = "\""; 
    char *token; 

    cout << "\nExtracting url.. "; 
    for (int j = 0; j < website_HTML.length() - to_find.length(); j++) 
    { 
     if (website_HTML.substr(j, to_find.length()) == to_find) 
     { 
      count++; 
      string_to_split=website_HTML.substr(j, to_find.length()+256); 
      strcpy(chr_String , string_to_split.c_str()); 
      token = strtok(chr_String, seps); 
      extracted_website_URL.push_back(token); 
      //cout<<website_HTML.substr(j, to_find.length()+30)<<" \n"; 

     } 

     std::cout << "\b\\" << std::flush;  
     std::cout << "\b|" << std::flush;   
     std::cout << "\b/" << std::flush;   
     std::cout << "\b-" << std::flush; 
    } 


    for(j=0;j<extracted_website_URL.size();j++) cout<<extracted_website_URL[j] <<" \n"; 
    cout<<"\n"<<extracted_website_URL.size()<<" URL's extracted "; 
    cout<<"\n\n"; 

} 
Смежные вопросы