当前位置:首页 » 编程语言 » c语言pcre
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言pcre

发布时间: 2023-06-12 16:52:35

c语言,如何对网页进行操作

首先,你这个想法还是很不错的,我以前也想这么做过。不过,学习html语言在这里肯定是次要的,主要的还是要学会分析的方法,而不是掌握被分析的内容,你说是吧?如果要用程序抓取网页自动保存到本地,就要会用socket编程,或者学习使用libcurl库,这些都比学html语言有用的多,不做网页抓取的时候,这些知识依然非常有用。而且,不同的网页,内容不同,规律可能也不同。比如你给的那个例子网址,我右键查看了源代码,里面就根本没有所谓的<td>、<tr>标签,即它的表格不是通过这些标签来实现的。所以,让你去看这些标签,就是南辕北辙了。网页分析,说到底还是字符串处理和分析。所以,你如果真的想学,不如好好学一下正则表达式和字符串处理相关的函数,以及函数库,比如tidy库等。正则表达式是用来匹配一类字符串的,方便找规律,也方便处理,你稍微学习一点点就知道有多么的强大,多么的有用了。而且,正则表达式跟语言无关,什么语言都能用得到,学这个不亏的。标准C库中没有正则表达式相关的函数,一般来说C中使用两种正则表达式库,一为POSIX
C正则库,二为perl正则库PCRE。相比较而言PCRE要强大些,POSIX
C正则库就足够使用。下面,这几个链接里面有网页分析的一些例子,虽然不都是C语言来处理的。但是,思路都是一致的。
所以,说到底,还是正则表达式、正则函数库、字符串处理函数这些才是根本。先说这些,希望对你有所帮助。如果你在学习过程中还有什么问题,欢迎随时交流:)C#的: http://www.jb51.net/article/16618.htmC#的: http://mytiu.blog.163.com/blog/static/1059718452009127112226478/这里还有一段C语言的代码,
是将下载下来的网页源代码处理成没有标签的纯文字文本#include
<tidy.h>#include
<buffio.h>#include
<stdio.h>#include
<errno.h>int
main(int
argc,
char
**argv
){const
char*
input
=
"<title>Foo</title>
Foo!";TidyBuffer
output
=
{0};TidyBuffer
errbuf
=
{0};int
rc
=
-1;Bool
ok;TidyDoc
tdoc
=
tidyCreate();
//
Initialize
"document"printf(
"Tidying:\t%s\n",
input
);ok
=
tidyOptSetBool(
tdoc,
TidyXhtmlOut,
yes
);
//
Convert
to
XHTMLif
(
ok
)rc
=
tidySetErrorBuffer(
tdoc,
&errbuf
);
//
Capture
diagnosticsif
(
rc
>=
0
)rc
=
tidyParseString(
tdoc,
input
);
//
Parse
the
inputif
(
rc
>=
0
)rc
=
tidyCleanAndRepair(
tdoc
);
//
Tidy
it
up!if
(
rc
>=
0
)rc
=
tidyRunDiagnostics(
tdoc
);
//
Kvetchif
(
rc
>
1
)
//
If
error,
force
output.rc
=
(
tidyOptSetBool(tdoc,
TidyForceOutput,
yes)
?
rc
:
-1
);if
(
rc
>=
0
)rc
=
tidySaveBuffer(
tdoc,
&output
);
//
Pretty
Printif
(
rc
>=
0
){if
(
rc
>
0
)printf(
"\nDiagnostics:\n\n%s",
errbuf.bp
);printf(
"\nAnd
here
is
the
result:\n\n%s",
output.bp
);}elseprintf(
"A
severe
error
(%d)
occurred.\n",
rc
);tidyBufFree(
&output
);tidyBufFree(
&errbuf
);tidyRelease(
tdoc
);return
rc;}

Ⅱ 怎么通过C语言读取网页里面的数据

简单的请求格式

GET /index.php HTTP/1.0
host:www.zixue7.com

当我们和服务器连接上之后,发送上面的数据过去,服务器就会返回 index.php 这个页面给我们。

GET 这个 是表示 以什么方式请求,HTTP中还有很多其他的请求方式,常用的就 GET POST (更详细的 可以点开上面 http协议 那个链接)

GET 后面紧跟一个空格 然后 给出,要获取的资源的名称, /index.php 就表示获取网站服务器根目录下 index.php 执行后所产生的内容,我们也可以改成 GET / HTTP/1.0 这就表示获取默认首页的内容 。 GET /1.html HTTP/1.0 就是获取 服务器根目录下 1.html的内容,很容易理解吧。

接下来隔一个空格 跟上 HTTP/1.0 表示 http协议的版本,这个是固定的 。

第二行 host:www.zixue7.com 用来指定 访问哪个主机。 大家都知道,一个服务器可以放很多个网站,每个网站有不同的域名,所以我们需要用这个host来指定 我们要访问的是哪个网站,这样 才能正确得访问到我们想访问的网站。

第一步,连接服务器。
第二步,按照http协议,发送请求数据,然后就是接受返回的内容。

没错,就这么简单。

在编写程序之前,我们先用一个小工具来模拟一下这个过程,好让我们对http协议了解更深入一些。

telnet工具 如果是 win7下的朋友 猛戳这里-->win7开启telnet功能

到此为止,我假设大家电脑上已经开启了 telnet功能,正题开始。

telnet 他是一个基于tcp/ip 协议的程序,为我们用户提供一个 与其他电脑通信的工具,我们可以使用他来和其他电脑进行连接通信。

开始->运行->输入telnet回车, 出现一个黑框如下。

我们这时就可以输入命令,来连接远程主机,比如我们这次是要连接我们自学去论坛 的服务器,
那么我们就输入 open www.zixue7.com 80 然后回车。

open 是打开的意思 后面跟上 要打开那个主机 然后 后面跟上端口, web服务器默认使用的是80端口,所以 要加上80端口(不加端口 telnet默认是23端口)。

然后会出现下图的情况,这时候 我们就可以输入命令了,输入的命令都将被发送到自学去论坛的服务器上面。大家注意一下 下图红色箭头所指出的部分,那里就是一个输入光标,不用管其他的字。

这就代表 我们已经和远程主机连接上了,就相当于我们上节课中 客户端执行到 connect 函数 之后 就是要调用 send函数发送数据了,在这里 我们只需要按键盘输入到黑色窗口中 就会发送到服务端。

我们依次输入以下内容,(注意,不能按退格,输入错误了,就重新打开telnet,重新操作。)

Ⅲ 如何优雅地使用c语言编写爬虫

前言
大家在平时或多或少地都会有编写网络爬虫的需求。一般来说,编写爬虫的首选自然非python莫属,除此之外,java等语言也是不错的选择。选择上述语言的原因不仅仅在于它们均有非常不错的网络请求库和字符串处理库,还在于基于上述语言的爬虫框架非常之多和完善。良好的爬虫框架可以确保爬虫程序的稳定性,以及编写程序的便捷性。所以,这个cspider爬虫库的使命在于,我们能够使用c语言,依然能够优雅地编写爬虫程序。
爬虫的特性
配置方便。使用一句设置函数,即可定义user agent,cookie,timeout,proxy以及抓取线程和解析线程的最大数量。
程序逻辑独立。用户可以分别定义爬虫的解析函数,和数据持久化函数。并且对于解析到的新url,用户可以使用cspider提供的addUrl函数,将其加入到任务队列中。
便捷的字符串处理。cspider中提供了基于pcre的简单的正则表达式函数,基于libxml2的xpath解析函数,以及用于解析json的cJSON库。
高效的抓取。cspider基于libuv调度抓取线程和解析线程,使用curl作为其网络请求库。
使用cspider的步骤
获取cspider_t。
自定义user agent,cookie,timeout,proxy以及抓取线程和解析线程的最大数量。
添加初始要抓取的url到任务队列。
编写解析函数和数据持久化函数。
启动爬虫。
例子
先来看下简单的爬虫例子,会在后面详细讲解例子。
#include<cspider/spider.h>

/*
自定义的解析函数,d为获取到的html页面字符串
*/
void p(cspider_t *cspider, char *d, void *user_data) {

char *get[100];
//xpath解析html
int size = xpath(d, "//body/div[@class='wrap']/div[@class='sort-column area']/div[@class='column-bd cfix']/ul[@class='st-list cfix']/li/strong/a", get, 100);

int i;
for (i = 0; i < size; i++) {
//将获取到的电影名称,持久化
saveString(cspider, get[i]);
}

}
/*
数据持久化函数,对上面解析函数中调用的saveString()函数传入的数据,进行进一步的保存
*/
void s(void *str, void *user_data) {
char *get = (char *)str;
FILE *file = (FILE*)user_data;
fprintf(file, "%s\n", get);
return;
}

int main() {
//初始化spider
cspider_t *spider = init_cspider();
char *agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:42.0) Gecko/20100101 Firefox/42.0";
//char *cookie = "bid=s3/yuH5Jd/I; ll=108288; viewed=1130500_24708145_6433169_4843567_1767120_5318823_1899158_1271597; __utma=30149280.927537245.1446813674.1446983217.1449139583.4; __utmz=30149280.1449139583.4.4.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/login; ps=y; [email protected]; dbcl2=58742090:QgZ2PSLiDLQ; ck=T9Wn; push_noty_num=0; push_doumail_num=7; ap=1; __utmb=30149280.0.10.1449139583; __utmc=30149280";

//设置要抓取页面的url
cs_setopt_url(spider, "so.tv.sohu.com/list_p1100_p20_p3_u5185_u5730_p40_p5_p6_p77_p80_p9_2d1_p101_p11.html");
//设置user agent
cs_setopt_useragent(spider, agent);
//cs_setopt_cookie(spider, cookie);
//传入解析函数和数据持久化函数的指针
cs_setopt_process(spider, p, NULL);
//s函数的user_data指针指向stdout
cs_setopt_save(spider, s, stdout);
//设置线程数量
cs_setopt_threadnum(spider, DOWNLOAD, 2);
cs_setopt_threadnum(spider, SAVE, 2);
//FILE *fp = fopen("log", "wb+");
//cs_setopt_logfile(spider, fp);
//开始爬虫
return cs_run(spider);
}
例子讲解
cspider_t *spider = init_cspider();获取初始的cspider。cs_setopt_xxx这类函数可以用来进行初始化设置。其中要注意的是: cs_setopt_process(spider,p,NULL);与cs_setopt_save(spider,s,stdout);,它们分别设置了解析函数p和数据持久化函数s,这两个函数需要用户自己实现,还有用户自定义的指向上下文信息user_data的指针。
在解析函数中,用户要定义解析的规则,并对解析得到的字符串可以调用saveString进行持久化,或者是调用addUrl将url加入到任务队列中。在saveString中传入的字符串会在用户自定义的数据持久函数中得到处理。此时,用户可以选择输出到文件或数据库等。
最后调用cs_run(spider)即可启动爬虫。
具体的API参数可在这里查看
总结
赶快使用cspider爬虫框架来编写爬虫吧!如果在使用过程中发现bug,欢迎反馈。

望采纳,谢谢

Ⅳ c语言 正则库 pcre 教程 (windows环境)

1、编译PCRE正则表达式库

(1) (MinGW + MSYS)

将PCRE源码包直接拷贝到MSYS目录下,(如:C:\MSYS\1.0\pcre\)

运行msys.bat启动MSYS,

在命令行输入

cd / // 回根目录

cd pcre // 进入PCRE目录

./configure // 配置编译

make // 编译全部

完成后,会在C:\MSYS\1.0\pcre\.libs\ 下生成所需要的文件:

libpcre-0.dll // PCRE的动态链接库

libpcre.dll.a // 调用PCRE动态链接库所用的LIB

libpcre.a // PCRE静态链接库

再配合上C:\MSYS\1.0\pcre\目录下的"pcre.h",就可以在程序中加入正则表达式支持了:)

(2) (于windows平台手动编译pcre,转载)

将 config.h.generic 重命名为 config.h
设置其中的 HAVE_BCOPY 参数为 0 (因为windows平台无b()函数)
重命名 pcre.h.generic 为 pcre.h.
重命名 pcre_chartables.c.dist 为 pcre_chartables.c.
编译 dftables.c 成可执行文件,要加入参数 -DHAVE_CONFIG_H,以便导入 config.h 文件中的设置
/* 重命名 pcre_chartables.c.dist 为 pcre_chartables.c */
运行编译的可执行文件 dftables.exe ,参数为 pcre_chartables.c
即 dftables.exe pcre_chartables.c
新建工程,包含下列文件,编译成lib文件即可
pcre_internal.h
ucp.h
ucpinternal.h
ucptable.h
pcre_chartables.c
pcre_compile.c
pcre_config.c
pcre_dfa_exec.c
pcre_exec.c
pcre_fullinfo.c
pcre_get.c
pcre_globals.c
pcre_info.c
pcre_maketables.c
pcre_newline.c
pcre_ord2utf8.c
pcre_refcount.c
pcre_study.c
pcre_tables.c
pcre_try_flipped.c
pcre_ucp_searchfuncs.c
pcre_valid_utf8.c
pcre_version.c
pcre_xclass.c

这样就可以生成 libpcre.a 文件了 (vc,bcc生成的是pcre.lib,大同小异)

2、使用生成的 libpcre.a (静态链接库)

在你的程序中添加:

#define PCRE_STATIC // 开启静态链接库支持(一定要添加该行,否则无法使用静态链接库)
#include "pcre.h" // PCRE头文件
并且添加 libpcre.a 到工程中,然后就可以在程序中使用PCRE函数了:)

编译选项 添加 /MT ,无头文件预编译.

3、使用生成的 libpcre-0.dll 和 libpcre.dll.a (动态链接库)

在你的程序中添加:

#include "pcre.h" // PCRE头文件

并且添加 libpcre.dll.a 到工程中,然后就可以在程序中使用PCRE函数了:)

================================================================================

命令行下的批处理解决方法 .如果已经下载,可以不用第一行.

goto START

首先确保控制台环境中有:
1、VC6命令行编译环境
2、wget.exe、unzip.exe、sed.exe、mv.exe
然后执行这个批处理文件,就可以得到VC版本的pcr.lib。

:START
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.7.zip
unzip pcre-7.7.zip
cd pcre-7.7
sed -e "s/#define HAVE_BCOPY 1/#define HAVE_BCOPY 0/g" config.h.generic > config.h
mv pcre.h.generic pcre.h
mv pcre_chartables.c.dist pcre_chartables.c
cl -MD -DHAVE_CONFIG_H dftables.c
dftables.exe pcre_chartables.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_chartables.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_compile.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_config.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_dfa_exec.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_exec.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_fullinfo.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_get.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_globals.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_info.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_maketables.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_newline.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_ord2utf8.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_refcount.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_study.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_tables.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_try_flipped.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_ucp_searchfuncs.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_valid_utf8.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_version.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_xclass.c
lib -out:libpcr.lib pcre_chartables.obj pcre_compile.obj pcre_config.obj pcre_dfa_exec.obj pcre_exec.obj pcre_fullinfo.obj pcre_get.obj pcre_globals.obj pcre_info.obj pcre_maketables.obj pcre_newline.obj pcre_ord2utf8.obj pcre_refcount.obj pcre_study.obj pcre_tables.obj pcre_try_flipped.obj pcre_ucp_searchfuncs.obj pcre_valid_utf8.obj pcre_version.obj pcre_xclass.obj

这样就出来了: pcre.h + libpcr.lib

==============================================================================

最近使用VC编译了一下她的源代码,其实步骤很简单, 如下

1 一些源文件改名
config.h.generic 改名为 config.h (注意里面的配置)
pcre.h.generic 改名为 pcre.h
pcre_chartables.c.dist 改名为 pcre_chartables.c

2 建立VC工程
建立一个VC的DLL工程,去掉原有的包含文件
将PCRE的所有pcre_*.c都加进去, pcre后面没有_的不要加, 后缀名是.cc的不要加
可以参考上面的.还有.h 文件也是要的.

3 修改工程设置

增加工程预编译宏 HAVE_CONFIG_H
不使用预编译头 Not Using Precompiled Headers
编译选项 添加 /MT

OK 完成以上三步,就可以在 VC 上编译通过了。

4 编译结果
使用时只需要编译出来的 .DLL .Lib 和 源代码目录的 pcre.h

Ⅳ 除了pcre,支持linux c语言的正则表达式库有哪些

REEC我没用过,我平时用的是#include <regex.h>
原来写过一个代码例子在csdn上面,C 和C++都能用
http://download.csdn.net/detail/ace_fei/4722736

Ⅵ C语言正则表达式匹配非负整数,为什么不能匹配成功,用的regexec

代码的逻辑无错,& reg被网络错转义成®
#include <stdio.h>
#include <regex.h>
#include <sys/types.h>
/* 主程序 */
int main(int argc, char** argv)
{
int status,i = 100;
int cflags = REG_EXTENDED;
regmatch_t pmatch[1];
const size_t nmatch = 1;
regex_t reg;
const char *pattern = "^\\d+$";
printf("%s\n",pattern);
char buf[] = "12345",buff[1024]={0};
i = regcomp(& reg,pattern,cflags);
printf("i = %d\n",i);
status = regexec(& reg,"12345",0,NULL,0);
if(status == REG_NOMATCH) {
printf("NO Match\n");
regerror (status, & reg, buff, 1024);
printf("%s\n",buff);
} else if(status == 0) {
printf("Match\n");
}
regfree(& reg);
return 0;
}

输出
^\d+$
i = 0
Match

主要注意正确链接上pcreposix和pcre两个库,链接的先后也不能错。

Ⅶ 用C语言怎么编出来课程表

一、功能模块概要说明:
1.输入函数:
char* uscanf(int,int,int) //图形模式下输入函数,大小写26个字母0-9数字外加空格键为有效输入,可以使用BACKSPACE。
2.开始界面,退出界面和主界面:
void starting() //开始界面
void end() //结束界面
char* index() //主选择界面函数,返回选择信息(字符串);
3.数据输入、创建链表模块
char* tinkey(char*,int,int) //输入切换处理
char* recourse(char*,int,int) //课程输入
int wdetect(struct person*,char*) //课程输入检测,检测课表一星期同一天同一时间段内课程安排是否重复,如果重复给出修改提示信息
char* infuse(char*,char*,int) //课表输入
struct course *ccreat(char*) //创建课程单向链表
struct person* pcreat(char *) //创建个人课表节点
char *infcreat(char**,struct person**,struct person**,char*)
//创建课表双向链表
4.课表输出
char *print(char*) //课表输出背景界面
char *pkey() //课表输出按纽界面及处理
int table(int,int,struct person*) //在指定区域一表格形式输出一个人的课表
int forebox(struct person*) //初略显示下三个人的课表提示
5.文件存储和装载
char* save(char *,struct person *) //保存为磁盘文件,在图形模式下进行文件读写操作之后,程序出现莫名其妙的异常显示情形
6.课表查询:
struct person *pdemand(struct person *,char *) //按人名字查询其课表安排。
struct person* wddemand(struct person*,int) //按星期几查询课程安排情况。
struct person *cdemand(struct person *,char *) //按课程查询老师或学生课程安排情况。
char *demand(struct person *) // 查询切换,并显示查询结果,按名字查询一次只能一个。按星期几和课程查询可以查询到多个,如查询到多个接果,按任意键可依次输出。
7.排序。
struct course *csort(struct course *) //按课程编号排序课表节点中课程链表
struct person *psort(struct person *) //按人学号或老师编号排序课表链表
char sort(struct person*) //排序切换,并提示排序结果
8.插入。
char *insert(char *,struct person **,struct person **)
//擦入课表节点
9.删除。
char *delete(struct person **,char *)
//按人名删除其课表节点

二、操作说明:
1. Infuse:选定这个键后按Enter进入学生输入菜单,你可以输入学生的学号,姓名,学生在一学期内的所学课程的课程名,课程号,学时,以及在一周内上课的地址。如果当输入某课程上课地址有重复时,系统自动发出报警信息,并提示出错的地方,以便修改,
当选定couse时,表明此学生所学的该课程的信息输入完成再输入另外所学课程的信息,如上所写照样输入,
当选定finish时,并按回车键后,表明此学生在这一学期内所学的课程信息输入完成。如要继续输入学生的信息如前所述。
当选定back时,并按下回车键后,返回TIME TABLE主菜单,选择主菜单里的功能对所输入的信息进行处理。
当选定exit时,并按下回车键后,返回程序。结束程序。
2.SAVE/LOAD 选定此并按回车。此键作用对所输入的信息进行格式输出/载入。输入你要保存信息的文件名,文件格式系统自动生成。利用键盘上的方向键和TAB键进行控制。
3.DEMAND:按ENTER键开始输入,按反向键进行查询切换。当按星期几和课程查询时候,如遇到查询到多个结果,按任意键可依次输出直到完。
4.INSERT:按ENTER键开始输入,按反向键进行查询切换。输入同INFURE项。
5. DELETE: 按ENTER键显示输入框开始输入。其他同上。
6.SORT:当提示框中SORT变为红色时候,表示被选中,按ENTER键开始插入,如成功给出提示信息。
7.PRINT:依次输出链表,如果输出链表为空则不进仍输出页面。NEXT为下一个,PRO为上一个。下面FORENOTICE 框显示后三个节点。
8.EXIT:退出系统。效果同按ESC。

三、例程:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
intmain()
{
char*p[8][5],*a;
inti=0,j=0,n;
a=(char*)malloc(sizeof(char));
for(j=0;j<5;j++)
for(i=0;i<8;i++)
{
printf("周%d第%d节",j+1,i+1);
scanf("%s",a);
p[j][i]=a;
a=(char*)malloc(sizeof(char));
}
printf("周一 周二 周三 周四 周五 ");
for(j=0;j<5;j++){
for(i=0;i<8;i++)
{
printf("%s ",p[j][i]);
}
printf(" ");
}
}

Ⅷ C语言中,如何在一字符串中插入字符

c[5]只有5个空间无法完全容纳字符串"hello",因为这个字符串需要占用6个字符位置。
所谓自动加'\0'的问题是:你写在双引号中的,编译程序会认为是字符串,会自动为你添加上一个字符串结尾符号0,而不是运行时添加的。
如果你用debug方式运行程序,调试环境自动会把你开设的char
a[5];进行初始化0的工作,这时你再将第1位初始化时,后面的0仍存在就好象字符串结尾已经存在了。如果非debug运行则没有这个初始化工作。
如果你用字符方式初始化应当写:char
c[6]={
'h','e','l','l','o','\0'
};
希望对你能有所帮助。