Как я могу извлечь домен из URL? - PullRequest
0 голосов
/ 19 июня 2010

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

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, но я не уверен, смогу ли я использовать это или мне нужно использовать другую библиотеку regex.

Ссылка на regex.h

Ответы [ 5 ]

4 голосов
/ 19 июня 2010

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

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

1 голос
/ 19 июня 2010

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

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

0 голосов
/ 12 июня 2018

что-то простое, но это может сделать работу:

#include <regex>

std::string getHostFromUrl(const std::string & url) {
  std::regex urlRe("^.*://([^/?:]+)/?.*$");

  return std::regex_replace(url, urlRe, "$1");
}
0 голосов
/ 11 сентября 2012

В окнах:

#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";

}
0 голосов
/ 31 июля 2011

См. * Get_active_tracker_domain * в command_pyroscope.cc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...