gpt4 book ai didi

c++ - 不使用正则表达式解析 HTTP 请求

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:40 27 4
gpt4 key购买 nike

我正在使用正则表达式来分隔 HTTP 请求的字段:

GET /index.asp?param1=hello&param2=128 HTTP/1.1

这样:

smatch m;
try
{
regex re1("(GET|POST) (.+) HTTP");
regex_search(query, m, re1);
}
catch (regex_error e)
{
printf("Regex 1 Error: %d\n", e.code());
}
string method = m[1];
string path = m[2];

try
{
regex re2("/(.+)?\\?(.+)?");
if (regex_search(path, m, re2))
{
document = m[1];
querystring = m[2];
}
}
catch (regex_error e)
{
printf("Regex 2 Error: %d\n", e.code());
}

不幸的是,这段代码适用于 MSVC,但不适用于 GCC 4.8.2(我在 Ubuntu Server 14.04 上有)。您能否建议使用普通的 std::string 运算符拆分该字符串的不同方法?

自查询字符串分隔符“?”以来,我不知道如何将 URL 拆分为不同的元素字符串中可能存在也可能不存在。

最佳答案

你可以使用 std::istringstream 来解析这个:

int main()
{
std::string request = "GET /index.asp?param1=hello&param2=128 HTTP/1.1";

// separate the 3 main parts

std::istringstream iss(request);

std::string method;
std::string query;
std::string protocol;

if(!(iss >> method >> query >> protocol))
{
std::cout << "ERROR: parsing request\n";
return 1;
}

// reset the std::istringstream with the query string

iss.clear();
iss.str(query);

std::string url;

if(!std::getline(iss, url, '?')) // remove the URL part
{
std::cout << "ERROR: parsing request url\n";
return 1;
}

// store query key/value pairs in a map
std::map<std::string, std::string> params;

std::string keyval, key, val;

while(std::getline(iss, keyval, '&')) // split each term
{
std::istringstream iss(keyval);

// split key/value pairs
if(std::getline(std::getline(iss, key, '='), val))
params[key] = val;
}

std::cout << "protocol: " << protocol << '\n';
std::cout << "method : " << method << '\n';
std::cout << "url : " << url << '\n';

for(auto const& param: params)
std::cout << "param : " << param.first << " = " << param.second << '\n';
}

输出:

protocol: HTTP/1.1
method : GET
url : /index.asp
param : param1 = hello
param : param2 = 128

关于c++ - 不使用正则表达式解析 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28268236/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com