计算PHP PCRE RegEx中的子模式



我想实现类似"正则表达式编辑器"的东西。它适用于我的PHP应用程序的高级用户。问题是,我需要正则表达式(更准确地说,对于任何给定的正则表达式)的类似"反射"的东西来找出它包含多少子模式。在Python中,我只需输入:

re.compile(regex).groups

如何在PHP中实现?如果能够安全地知道表达式是否能够编译,那就更好了。在Python中,会引发异常,并且很容易处理。PHP在没有任何警告的情况下运行我的应用程序,或者产生一些无法捕获的警告/错误。

谢谢你的建议!

对于妊娠正则表达式没有自省功能- pcre有一个函数(pcre_fulllinfo),但出于某种原因php开发人员没有为此提供胶水。你可以考虑在bugs.php.net上提交一个特性请求。

检查regexp有效性的唯一方法是在try-catch块中编译它,参见如何检查字符串是否是有效的PCRE?例如:

也就是说,我不认为允许用户在服务器上执行任意正则表达式是一个好主意。一个恶意的或者仅仅是不正确的表达可以很快地消耗掉所有的内存。

我知道这很困难。可能模式的最大数量很难确定,因为扩展/POSIX/Perl正则表达式非常复杂。它们会嵌套,捕获一些模式意味着其他模式不会被捕获,等等。我不知道有什么方法可以直接在PHP中确定模式的最大数量,你自己计算出来基本上等于重新实现整个引擎,这是非常复杂的;我怀疑我们大多数人只使用了它的一半。

问题的后半部分是骗人的

最新更新