Nginx模块开发中使用PCRE正则表达式匹配
Nginx内部对pcre库的常用操作进行了封装. 封装的源码位于nginx/src/core/ngx_regex.c
, 同时将pcre内使用的内存池更变为了Nginx的内存池.
pcre_compile
:Nginx封装了
pcre_compile
方法. 方法名为ngx_regex_compile
.ngx_regex_compile
方法的参数需要传入一个ngx_regex_compile_t
来进行编译正则等操作.ngx_regex_compile_t
结构如下:typedef struct { ngx_str_t pattern; // 正则 ngx_pool_t *pool; // 每个request分配的内存池 ngx_int_t options; // pcre options ngx_regex_t *regex; // 编译完毕后的pcre实例 int captures; int named_captures; int name_size; u_char *names; ngx_str_t err; // 错误信息 } ngx_regex_compile_t;`
当编译正则成功时会返回
NGX_OK
并且会在内部调用pcre_study
来进一步提高正则匹配性能. 失败时会返回NGX_ERROR
. 同时失败的错误信息会保存在err
成员变量中.pcre_exec
Nginx同样封装了
pcre_exec
封装后的方法名为:ngx_regex_exec
源码位于nginx/src/core/ngx_regex.h
文件中:#define ngx_regex_exec(re, s, captures, size) \ pcre_exec(re->code, re->extra, (const char *) (s)->data, (s)->len, 0, 0, \ captures, size)
可以看到参数
re
要求的是ngx_regex_compile_t
中的regex
成员变量. 而被搜索的字符串被替换成了Nginx内部的字符串类型ngx_str_t
. 同时也将Nginx内部不常用的搜索偏移以及选项设置为成0. 如果仍需要使用偏移以及选项的话可以直接使用pcre_exec
来跳过Nginx的封装.
Refs: