APR 1.2.2是否具有正则表达式支持?有关使用它的任何文档或教程?

该文档很烂。真的很糟糕。

最佳答案

以下是本书Writing Apache modules with Perl and C的直接内容

regex_t *ap_pregcomp (pool *p, const char *pattern, int cflags);
    void ap_pregfree (pool *p, regex_t *reg);

Apache使用系统库的正则表达式支持正则表达式匹配
例程regcomp(),regexec(),regerror()和regfree()。如果这些功能不可用,则Apache使用其自己的正则表达式例程包。正则表达式例程的文档可以在系统手册页中找到。如果您的系统不支持这些例程,则可以在Apache源代码树的regex /子目录中找到Apache正则表达式包的文档。

正则表达式匹配分为两个阶段。在第一阶段,您致电
regcomp()将正则表达式模式字符串编译为已编译形式。在第二
阶段,您将编译后的模式传递给regexec()以将搜索模式与源字符串进行匹配。在执行其正则表达式匹配的过程中,regexec()将每个匹配的带括号的子表达式的偏移量写入名为pmatch []的数组中。此阵列的重要性很快将变得显而易见。

Apache提供了围绕regcomp()和regfree()的包装例程,
使正则表达式的使用更加简单。 ap_pregcomp()就像
regcomp()编译正则表达式字符串,但它会自动分配
提供的资源池指针中已编译表达式的内存。模式
包含要编译的字符串,而cflags是控制位的类型的标志的位掩码
正则表达式执行。标志的完整列表可以在regcomp()手册中找到
页。

除了分配正则表达式外,ap_pregcomp()还会自动安装一个
清理处理程序,该处理程序调用regfree()释放已编译常规文件使用的内存
事务完成时的表达式。

说到这,由ap_pregcomp()安装的清理处理程序是ap_pregfree()。它释放
通过调用regfree()的正则表达式,然后将其自身从清理处理程序中删除
列表,以确保不会被调用两次。如果出于某种不太可能的原因,您需要自己调用ap_pregfree(),而在正常执行清理之前您需要释放正则表达式使用的内存。
char *ap_pregsub (pool *p, const char *input, const char *source, size_t nmatch,
regmatch_t pmatch[ ])

与regexec()执行正则表达式匹配后,可以使用ap_pregsub()来
根据操作期间匹配的子表达式执行一系列字符串替换。此函数使用pmatch []数组,该regexec()填充由正则表达式匹配的所有带括号的子表达式的开始和结束位置。您为ap_pregsub()提供p,资源池指针,输入,描述要执行的替换的字符串,source,用于正则表达式match的源字符串,nmatch,pmatch数组的大小以及pmatch本身。
输入是包含表达式$ 1到$ 9的任意字符串。 ap_pregsub()将这些表达式替换为源字符串中对应的匹配子表达式。 $ 0也可供您使用:它对应于整个匹配的字符串。
返回值将是由替换的输入字符串组成的新分配的字符串。

下面的示例显示ap_pregsub()用于替换.htm和.HTM
.html扩展名。我们首先调用ap_pregcomp()来编译所需的
正则表达式,并从资源分配的内存中返回编译后的模式
池。我们指定标志来使匹配不区分大小写并使用现代
正则表达式语法。我们继续初始化pmatch []数组以容纳两个regmatch_t元素。需要两个元素:第一个元素对应于$ 0,而
对于模式中的单个括号内的子表达式,第二个。接下来,我们使用编译后的模式,请求的文件名,pmatch []数组及其长度调用regexec()。 regexec()的最后一个参数(用于传递各种附加选项标志)设置为零。如果regexec()返回零,我们继续调用ap_pregsub()将匹配的子表达式(文件名减去其扩展名)插值到字符串$ 1.html中,从而有效地替换了扩展名。
ap_regmatch_t pmatch[2];
ap_regex_t *cpat = ap_pregcomp(r->pool, "(.+)\\.htm$",
    AP_REG_EXTENDED|AP_REG_ICASE);
if (ap_regexec(cpat, r->filename, cpat->re_nsub+1, pmatch, 0) == 0)
{
  r->filename = ap_pregsub(r->pool, "$1.html",
      r->filename, cpat->re_nsub+1,
      pmatch);
}

10-04 21:15