使用C解析URL的最佳方法?

Jia*_*ian 34 c url parsing

我有这样的网址:

http://192.168.0.1:8080/servlet/rece
Run Code Online (Sandbox Code Playgroud)

我想解析URL以获取值:

IP: 192.168.0.1
Port: 8080
page:  /servlet/rece
Run Code Online (Sandbox Code Playgroud)

我怎么做?

bor*_*yer 25

就个人而言,我从W3C窃取HTParse.c模块 (例如,它在lynx Web浏览器中使用).然后,你可以做以下事情:

 strncpy(hostname, HTParse(url, "", PARSE_HOST), size)
Run Code Online (Sandbox Code Playgroud)

使用完善且已调试的库的重要一点是,您不会陷入URL解析的典型陷阱(当主机是IP地址时,许多正则表达式失败,例如,特别是IPv6).

  • 请注意,没有真正含糊不清的地方.URI标准RFC 3986很明确,您的示例是非法的(您需要方括号). (3认同)
  • 谢谢,这很令人欣慰.我错误地认为,面向用户的代码(如浏览器地址栏)正在接受没有方括号的地址.快速浏览一些流行的浏览器会发现情况并非如此. (3认同)

Jia*_*ian 11

我写了一个简单的代码使用sscanf.我想有一个解析它的基本方法.

#include <stdio.h>

int main(void)
{
    const char text[] = "http://192.168.0.2:8888/servlet/rece";
    char ip[100];
    int port = 80;
    char page[100];
    sscanf(text, "http://%99[^:]:%99d/%99[^\n]", ip, &port, page);
    printf("ip = \"%s\"\n", ip);
    printf("port = \"%d\"\n", port);
    printf("page = \"%s\"\n", page);
    return 0;
}

./urlparse
ip = "192.168.0.2"
port = "8888"
page = "servlet/rece"
Run Code Online (Sandbox Code Playgroud)

  • [^:]在此上下文中不是正则表达式,它只是sscanf()的特殊格式说明符.这是标准的.例如,请参见本手册页:<http://linux.die.net/man/3/sscanf>. (5认同)
  • 当没有端口号时,解析有一些错误,它不能正常工作.我该如何解决呢? (3认同)

dsm*_*dsm 10

如果你想要简单的方法,使用正则表达式.否则使用FLEX/BISON.

您还可以使用URI解析库


vyo*_*yom 10

可能会迟到,...我使用的是 - http_parser_parse_url()函数和从Joyent/HTTP解析器库中分离出来的所需宏- 运行良好,~600LOC.


dir*_*tly -3

编写自定义解析器或使用字符串替换函数之一来替换分隔符“:”,然后使用sscanf().

  • “编写一些可以满足您需要的代码”如何成为可接受的答案? (30认同)
  • 有很多陷阱需要注意,因此自定义解析器在我看来是个坏主意。 (22认同)