diff --git a/docs/conf/modules.conf.example b/docs/conf/modules.conf.example index f76954adf..18042597a 100644 --- a/docs/conf/modules.conf.example +++ b/docs/conf/modules.conf.example @@ -1765,6 +1765,10 @@ # module. You must have at least 1 provider loaded to use the filter or # R-line modules. # +# +# If you were using PCRE in v3 or earlier you can enable this to try to +# keep compatibility with your regular expressions from older versions. +# #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# # Regular Expression Provider for RE2 Regular Expressions. diff --git a/src/modules/extra/m_regex_pcre2.cpp b/src/modules/extra/m_regex_pcre2.cpp index a8e9c535a..c0acd627d 100644 --- a/src/modules/extra/m_regex_pcre2.cpp +++ b/src/modules/extra/m_regex_pcre2.cpp @@ -75,15 +75,34 @@ class PCRE2Pattern final } }; +class PCRECompatEngine final + : public Regex::Engine +{ +public: + PCRECompatEngine(Module* Creator, const std::string& Name) + : Regex::Engine(Creator, Name) + { + if (!ServerInstance->Config->ConfValue("pcre2")->getBool("compat")) + DisableAutoRegister(); + } + + Regex::PatternPtr Create(const std::string& pattern, uint8_t options) override + { + return std::make_shared(pattern, options); + } +}; + class ModuleRegexPCRE2 final : public Module { private: + PCRECompatEngine compatregex; Regex::SimpleEngine regex; public: ModuleRegexPCRE2() : Module(VF_VENDOR, "Provides the pcre2 regular expression engine which uses the PCRE2 library.") + , compatregex(this, "pcre") , regex(this, "pcre2") { }