用C和正则表达式来提取网页中的URL

hzgmm 2012-04-11 11:22:32
我已经把一个网页下载保存到了文件中,但是要从中提取所有的URL,听说可以用正则表达式来实现,

但是没有用过。求提示!!

PS:在linux下的C
...全文
526 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzgmm 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 5 楼 的回复:

引用 4 楼 的回复:
上面是一个网上的例子,经过修改不行。。。。。。。。。。。

我的目的是,主要是从一个html文件中把所有存在的url读取出来

网址的形式乱七八糟,很难完全匹配完。
所以你得分析一下你那个html里面的url的规律,然后针对性的写正则去匹配读取。

+1
太复杂反而匹配不了
C/C++ code

char patt……
[/Quote]
这个虽然可以,但是匹配不全...
时间一粒 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:
上面是一个网上的例子,经过修改不行。。。。。。。。。。。

我的目的是,主要是从一个html文件中把所有存在的url读取出来

网址的形式乱七八糟,很难完全匹配完。
所以你得分析一下你那个html里面的url的规律,然后针对性的写正则去匹配读取。
[/Quote]
+1
太复杂反而匹配不了

char pattern[] = "<a href.+?+\"";

用这个试试
赵4老师 2012-04-11
  • 打赏
  • 举报
回复
推荐使用regtest软件测试正则表达式
evencoming 2012-04-11
  • 打赏
  • 举报
回复
pcre正则。然后稍微了解下正则的简单使用。试试吧
佛魔尽诛 2012-04-11
  • 打赏
  • 举报
回复
感觉用不着正则 自己写捕捉函数 用链表存储也是很好的方法~
evencoming 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
上面是一个网上的例子,经过修改不行。。。。。。。。。。。

我的目的是,主要是从一个html文件中把所有存在的url读取出来
[/Quote]
网址的形式乱七八糟,很难完全匹配完。
所以你得分析一下你那个html里面的url的规律,然后针对性的写正则去匹配读取。
hzgmm 2012-04-11
  • 打赏
  • 举报
回复
上面是一个网上的例子,经过修改不行。。。。。。。。。。。

我的目的是,主要是从一个html文件中把所有存在的url读取出来
hzgmm 2012-04-11
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>
#include <regex.h>

#define SUBSLEN 100
#define EBUFLEN 128 /* error buffer length */
#define BUFLEN 1024 /* matched buffer length */
#define FILE_PATH "/home/best/testUrl.html","w+"

int main(int argc, char **argv)
{
FILE *fp = NULL;
size_t len; /* store error message length */
regex_t re; /* store compilned regular expression */
regmatch_t subs[SUBSLEN]; /* store matched string position */
char matched[BUFLEN]; /* store matched strings */
char errbuf[EBUFLEN]; /* store error message */
int err, i;

//char string[] = "AAAAabaaababAbAbCdCd123123 11(123){12} ";
//char pattern[] = "(\\([0-9]+\\))(\\{[0-9]+\\}{1})$ ";
char string[100] = {0};
//char pattern[] ="([/w-]+/.)+[/w-]+.([^a-z])(/[/w-: ./?%&=]*)?|[a-zA-Z/-/.][/w-]+.([^a-z])(/[/w-: ./?%&=]*)?";
char pattern[] ="([http|https]://)?([/w-]+/.)+[/w-]+(/[/w- ./?%&=]*)?";
printf("String : %s\n ", string);
printf("Pattern: \" %s \" \n", pattern);

if(NULL == (fp = fopen(FILE_PATH)))
{
printf("Open error\n");
return 0;
}
/* compile regular expression */
err = regcomp(&re, pattern, REG_EXTENDED);

if (err)
{
len = regerror(err, &re, errbuf, sizeof(errbuf));
fprintf(stderr, "error: regcomp: %s\n ", errbuf);
exit(1);
}
printf("Total has subexpression: %d\n ", re.re_nsub);

/* execute pattern match */
// regexec (regex_t *compiled, char *string, size_t nmatch, regmatch_t matchptr [], int eflags)
while(100 == fread(string,1,100,fp))
{
err = regexec(&re, string, (size_t) SUBSLEN, subs, 0);

if (err == REG_NOMATCH)
{
fprintf(stderr, "Sorry, no match ...\n ");
regfree(&re);
exit(0);
}
else if (err)
{
len = regerror(err, &re, errbuf, sizeof(errbuf));
fprintf(stderr, "error: regexec: %s\n ", errbuf);
exit(1);
}

/* if no REG_NOMATCH and no error, then pattern matched */
//printf("\nOK, has matched ...\n\n ");
for (i = 0; i <= re.re_nsub; i++) {
if (i == 0)
{
printf("begin: %d, end: %d, ", subs->rm_eo, subs->rm_eo);
} else {
printf("subexpression %d begin: %d, end: %d, ", i,subs->rm_so, subs->rm_eo);
}
len = subs->rm_eo - subs->rm_so;
memcpy(matched, string + subs->rm_so, len);
matched[len] = '\0';
printf("match: %s\n ", matched);
}
}
regfree(&re);
exit(0);
}


运行结果:error: regcomp: Invalid range end

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧