Ниже прямо из книги Написание модулей Apache с Perl и 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, указателем пула ресурсов, вводом, символьной строкой, описывающей выполняемые подстановки, источником, исходной строкой, используемой для сопоставления регулярного выражения, nmatch, размером массива pmatch и самим pmatch.
input - любая произвольная строка, содержащая выражения от $ 1 до $ 9. ap_pregsub () заменяет эти выражения соответствующими сопоставленными подвыражениями из исходной строки. $ 0 также доступен для вашего использования: он соответствует всей совпадающей строке.
Возвращаемое значение будет вновь выделенной строкой, сформированной из замещенной входной строки.
В следующем примере показано, как ap_pregsub () используется для замены .htm и .HTM
расширение файла с .html. Мы начинаем с вызова ap_pregcomp () для компиляции желаемого
регулярное выражение и возвращает скомпилированный шаблон в память, выделенную из ресурса
бассейн. Мы указываем флаги, которые делают совпадение нечувствительным к регистру и используют современные
синтаксис регулярного выражения. Мы приступаем к инициализации массива pmatch [] для хранения двух элементов regmatch_t. Необходимы два элемента: первый, который соответствует $ 0, ивторой для заключенного в скобки подвыражения в шаблоне. Затем мы вызываем regexec () со скомпилированным шаблоном, запрошенным именем файла, массивом pmatch [] и его длиной. Последний аргумент 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);
}