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 optionsngx_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:

  • http://dinic.iteye.com/blog/2057150
  • http://blog.csdn.net/wangwenwen/article/details/7578388?spm=5176.8246799.blogcont.5.C4EXiu

Nginx模块开发中使用PCRE正则表达式匹配相关推荐

  1. Nginx模块开发入门

    前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...

  2. Nginx模块开发系列1--预备知识

    摘要:在进行Nginx模块开发之前,需要先了解一下Nginx的模块工作原理以及需要用到的结构体. 文章目录 1.Nginx模块工作原理 2.ngx_module_t 结构体 3.ngx_command ...

  3. 【Linux网络编程】Nginx -- 模块开发(upstream / subrequest)

    [Linux网络编程]Nginx -- 模块开发(upstream / subrequest) [1]upstream VS subrequest 简介 upstream 为访问上游服务器,它把Ngi ...

  4. Nginx 模块开发

    Nginx 模块概述 Nginx 模块有三种角色: 处理请求并产生输出的 Handler 模块: 处理由 Handler 产生的输出的 Filter(滤波器)模块: 当出现多个后台服务器时,Load- ...

  5. Nginx 模块开发高级篇

    Nginx 模块开发高级篇 变量 综述 在Nginx中同一个请求需要在模块之间数据的传递或者说在配置文件里面使用模块动态的数据一般来说都是使用变量,比如在HTTP模块中导出了host/remote_a ...

  6. Nginx模块开发:模块结构的源码阅读以及过滤器(Filter)模块的实现

    Nginx模块开发:模块结构的源码阅读以及过滤器(Filter)模块的实现 一.Nignx中的模块是什么? 二.模块的基本结构 `ngx_module_s` `ngx_command_s` `ngx_ ...

  7. 推荐我的新书《深入理解Nginx:模块开发与架构解析》

    http://www.china-pub.com/STATIC/zt_mb/zt_huodong_2013_3.asp?filename=2013_jsj_nginx_20130401 目录 < ...

  8. java正则表达式匹配数字范围_在java中怎么利用正则表达式匹配数字

    在java中怎么利用正则表达式匹配数字 发布时间:2020-12-03 17:47:12 来源:亿速云 阅读:58 作者:Leah 在java中怎么利用正则表达式匹配数字?针对这个问题,这篇文章详细介 ...

  9. Nginx模块开发—Nginx代码规范

    2019独角兽企业重金招聘Python工程师标准>>> 1.简介 基本上,Nginx所采用的是一种类似BSD的C代码风格,很规范.也很清晰.建议我们的Nginx模块开发也采用Ngin ...

最新文章

  1. HDU5154拓扑排序模版题
  2. UVa 412 - Pi
  3. java打印sql表_java程序获得SqlServer数据表的表结构
  4. python 单行读取文件_python – 在使用for循环读取文件时跳过一行
  5. Packet Tracer实验——使用三层交换机实现vlan间的通信(详解)
  6. 自定义AlertDialog控件的使用(AndroidStudio)
  7. 普通web项目转maven项目
  8. 约5亿条!华住旗下酒店开房信息泄露于“暗网”售卖,你改密码了吗?
  9. ArcGIS紧凑型切片读取与应用2-webgis动态加载紧凑型切片(附源码)
  10. python vimdiff_Vim实践与学习-09其他
  11. Deepin - 环境配置及软件安装卸载记录(Debain镜像源)
  12. nestjs连接mysql数据库的方法与使用
  13. 毕业论文ppt的研究方法及过程计算机专业,毕业论文答辩ppt(要求和制作技巧)...
  14. 一生要知道的100幅世界名画
  15. 失意的互联网人拼命叩开Web3大门
  16. 升级后如何从Windows.old文件夹还原文件
  17. sorry, unimplemented: non-trivial designated initializers not supported
  18. 计算机网络dce是什么意思,DTE与DCE的解释
  19. Nginx代理浏览器接口调用本地的后端接口
  20. MultiValueMap

热门文章

  1. JavaScript消息框应用
  2. 会计的思考(3):通过公司例会制度加强财务管理职能
  3. RouterOS V2.9.27 固定IP双电信分流教程(详)
  4. Sys和system用户、sysdba 和sysoper系统权限、dba角色的区别
  5. Linux的命令组成
  6. CodeForces - 1523D Love-Hate(随机数+状压dp)
  7. LOJ - #116. 有源汇有上下界最大流(有源汇有上下界的最大流)
  8. java如果属性为空返回其他_后台返回前台数据(实体类)如果存在为空或‘’的属性,如何过滤掉...
  9. 椭圆中心到椭圆切线的距离
  10. 关于C++,Java和Python中的随机数生成法