Nginx模块开发中使用PCRE正则表达式匹配
Nginx內(nèi)部對pcre庫的常用操作進(jìn)行了封裝. 封裝的源碼位于nginx/src/core/ngx_regex.c, 同時(shí)將pcre內(nèi)使用的內(nèi)存池更變?yōu)榱薔ginx的內(nèi)存池.
-
pcre_compile:
Nginx封裝了pcre_compile方法. 方法名為ngx_regex_compile.
ngx_regex_compile方法的參數(shù)需要傳入一個(gè)ngx_regex_compile_t來進(jìn)行編譯正則等操作.
ngx_regex_compile_t結(jié)構(gòu)如下:
typedef struct {ngx_str_t pattern; // 正則ngx_pool_t *pool; // 每個(gè)request分配的內(nèi)存池ngx_int_t options; // pcre optionsngx_regex_t *regex; // 編譯完畢后的pcre實(shí)例int captures;int named_captures;int name_size;u_char *names;ngx_str_t err; // 錯(cuò)誤信息 } ngx_regex_compile_t;`當(dāng)編譯正則成功時(shí)會返回NGX_OK并且會在內(nèi)部調(diào)用pcre_study來進(jìn)一步提高正則匹配性能. 失敗時(shí)會返回NGX_ERROR. 同時(shí)失敗的錯(cuò)誤信息會保存在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)可以看到參數(shù)re要求的是ngx_regex_compile_t中的regex成員變量. 而被搜索的字符串被替換成了Nginx內(nèi)部的字符串類型ngx_str_t. 同時(shí)也將Nginx內(nèi)部不常用的搜索偏移以及選項(xiàng)設(shè)置為成0. 如果仍需要使用偏移以及選項(xiàng)的話可以直接使用pcre_exec來跳過Nginx的封裝.
Refs:
- http://dinic.iteye.com/blog/2057150
- http://blog.csdn.net/wangwenwen/article/details/7578388?spm=5176.8246799.blogcont.5.C4EXiu
總結(jié)
以上是生活随笔為你收集整理的Nginx模块开发中使用PCRE正则表达式匹配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx源码分析(5)——监听sock
- 下一篇: nginx处理http(http变量篇)