PHP 手册对 PCRE 的“S”(模式的额外分析)修饰符进行了以下说明http://php.net/manual/en/reference.pcre.pattern.modifiers.php http://php.net/manual/en/reference.pcre.pattern.modifiers.php
S
当一个模式要使用多次时,值得
花更多的时间分析它以加快时间
用于匹配。如果设置了这个修饰符,那么这个额外的分析是
执行。目前,研究模式仅适用于
没有单一固定起始点的非锚定模式
特点。
因此它的用法与应该多次使用且内部没有锚点的模式相关(例如^
, $
) 或固定的起始字符序列,例如像这样的模式'/^abc/'
.
但没有任何具体细节,例如应用此修改器及其实际工作原理。
它是否仅适用于当前执行脚本的 PHP 线程,并且在执行脚本后,模式的“缓存”分析会丢失吗?或者引擎是否将模式分析存储在全局缓存中,然后将其提供给使用 PCRE 以及标有此修饰符的模式的多个 PHP 线程?
另外,来自PCRE的介绍:http://php.net/manual/en/intro.pcre.php http://php.net/manual/en/intro.pcre.php
注意:此扩展维护已编译的全局每线程缓存
正则表达式(最多 4096)
如果“S”修饰符仅在每个线程中使用,它与已编译正则表达式的 PCRE 缓存有何不同?我猜想存储了附加信息,就像 MySQL 在索引表中的行时所做的那样(当然,在 PCRE 的情况下,这些附加信息存储在内存中)。
最后但并非最不重要的一点是,有人经历过他/她使用此修改器的真实用例吗?您是否注意到了改进并欣赏它的好处?
感谢您的关注。
PHP 文档引用了 PCRE 文档的一小部分。以下是更多详细信息(重点是我的)PCRE 8.36:
如果要多次使用编译的模式,则值得花费更多时间对其进行分析,以加快匹配所需的时间。功能pcre_study()
将指向已编译模式的指针作为其第一个参数。如果研究模式产生有助于加快匹配速度的附加信息,pcre_study()
返回一个指向 a 的指针pcre_extra
块,其中study_data
字段指向研究结果。
...
研究模式有两件事:首先,计算匹配模式所需的主题字符串长度的下限。这并不意味着有任何该长度的字符串匹配,但它确实保证没有更短的字符串匹配。该值用于避免尝试匹配比下限短的字符串而浪费时间。您可以通过以下方式找到调用程序中的值pcre_fullinfo()
功能。
研究模式对于没有单个固定起始字符的非锚定模式也很有用。创建可能的起始字节的位图。这可以加快在主题中找到开始匹配的位置的速度。(在 16 位模式下,位图用于小于 256 的 16 位值。在 32 位模式下,位图用于小于 256 的 32 位值。)
请注意,在后来的 PCRE 版本(v10.00,也称为 PCRE2)中,该库经历了大规模的重构和 API 重新设计。后果之一就是学习always在 PCRE 10.00 及更高版本中执行。我不知道 PHP 何时会使用 PCRE2,但这迟早会发生,因为从现在开始 PCRE 8.x 将不会获得任何新功能。
这是来自PCRE2发布公告 https://lists.exim.org/lurker/message/20150105.162835.0666407a.en.html:
对编译模式的显式“研究”已被废除 - 现在总是如此
自动发生。 JIT编译是通过调用一个新函数来完成的,pcre2_jit_compile()
成功返回后pcre2_compile()
.
至于你的第二个问题:
如果“S”修饰符仅在每个线程中使用,它与已编译正则表达式的 PCRE 缓存有何不同?
PCRE 本身没有缓存,但 PHP 维护了正则表达式的缓存,以避免一遍又一遍地重新编译相同的模式,例如,如果您使用preg_
循环内的函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)