【问题标题】:Delete part of string in C (regex?)删除 C 中的部分字符串(正则表达式?)
【发布时间】:2012-02-08 23:22:43
【问题描述】:

我有一个长字符串,其中包含如下信息:

"GET http://www.google.se/ HTTP/1.1\r\n
Host: www.google.se\r\n
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:2.0) Gecko/20100101 Firefox/4.0\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n
Accept-Language: en-us,en;q=0.5\r\n
Accept-Encoding: gzip, deflate\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n
Keep-Alive: 115\r\n
Proxy-Connection: keep-alive\r\n
Cookie: PREF=ID=7d6a62c557413bc8:FF=0:TM=1327968040:LM=1327968040:S=U1A51rCRDDMTF295\r\n
Cache-Control: max-age=0\r\n\r\n"

我想摆脱代理连接下的保持活动部分.. 这就是我目前正在做的事情:

  1. 将字符串(标题)放入函数中。
  2. 使用两个字符串(标题和主机)创建结构
  3. 将标头中的主机名放入主机部分(显然)
  4. 并将标题放在标题部分。

现在我想在将标头放入结构的标头部分之前摆脱 keep-alive 部分。

有什么想法吗?

这是我迄今为止所做的一些代码。我是 C 新手,所以可能不是你见过的最漂亮的代码..

struct ParsedHeader header_parser(char * input) {
  struct ParsedHeader h;
  int status;
  regex_t regex;
  char * result_begin = NULL;

  regcomp(&regex, "host:", REG_EXTENDED|REG_ICASE|REG_NOSUB);
  if((status = regexec(&regex, input, (size_t) 0, NULL, 0)) == 0) {
    char end = '\r';
    char * header = malloc(strlen(input));

    char * begin = "host:";

    size_t result_size = 0;
    memcpy(header, input, strlen(input));
    to_lower(input, header, strlen(input));
    result_begin = (strstr(header, begin) + 6);

    char * result_end = strchr(result_begin, end);
    result_end[0] = '\0';
    //char result[strlen(result_begin)] = result_begin;
    free(header);
  }
  regfree(&regex);

  h.header = input;
  h.host = result_begin;

  return h;
}

【问题讨论】:

  • 也许如果你在这里发布了你的代码中最相关的部分,这个问题会得到更多的关注。
  • 你想去掉这个特定的KeepAlive: 115 行,还是KeepAlive 的任何可能值?
  • 错误:将 malloc 更改为 malloc(strlen(input)+1),因为您需要为终止的 null 分配空间。

标签: c regex string parsing proxy


【解决方案1】:

如果我正确理解您的问题,您只想删除“Keep-Alive”字符串。这样做:

// assume buffer contains the long input string
char *pBegin; 
char *pEnd;
pBegin = strstr(buffer, "Keep-Alive:");
if (pBegin)
{
    pEnd = strstr(pBegin, "\r\n");
    if (pEnd)
        strcpy(pBegin, pEnd+2);
}

但是,如果您想要从 Proxy-Connection 标头中删除“keep-alive”字符串,则可以使用类似的解决方案:

char *pBegin; 
char *pEnd;
pBegin = strstr(buffer, "Proxy-Connection:");
if (pBegin)
{
    pBegin = strstr(pBegin, "keep-alive");
    if (pBegin)
        strcpy(pBegin, pBegin+strlen("keep-alive"));
}

【讨论】:

  • 我想你理解错了:“我想去掉 Proxy-Connection 下的 keep-alive 部分”。这似乎是他宁愿修改Proxy-Connection 标头。
  • 好吧,我解决了段错误。只是小写和大写的问题。但它仍然无法正常工作.. keep-alive 部分仍然存在!
  • 这很可能再次区分大小写,因为 strstr 函数区分大小写。如果您可以先将整个字符串小写,然后始终将小写字母传递给 strstr,则可以解决此问题。
猜你喜欢
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 2023-01-31
  • 2022-01-09
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
相关资源
最近更新 更多