我无法找到一个权威的答案,虽然我99.9%肯定这是真的.正如我所期待的许多其他代码所做的那样,依赖于它的接受答案是正确的.但真正了解某事的人preg_match_all(不是通过观察,而是通过指定的要求或指定的算法)可以确认这是保证行为吗?我无法从文档中收集它.
我的用例很简单:
preg_match_all("/$regexp/", $content, $matches, PREG_OFFSET_CAPTURE);
Run Code Online (Sandbox Code Playgroud)
我知道它$regexp不包含任何子模式,因此文档告诉我$matches[0]将是一个2元素数组的数组,其中每个子数组都有数字键0的元素,其中包含与模式匹配的字符串,以及数字键1包含$content匹配发生的偏移量.虽然通过增加偏移量来排序数组元素似乎是合理的,但是我没有看到需要的地方,如果不是这样的话就会出现错误.虽然我无法想象它是如何实现有用的效果的,但也许有一些方法可以实现preg_match_all多个线程附加其部分结果而不会合并到完全排序的顺序.
在我的特殊情况下,我只关心偏移,而不是匹配的字符串,但偏移量增加至关重要.因此,我使用腰带和吊带心态编码:
preg_match_all("/$regexp/", $content, $matches, PREG_OFFSET_CAPTURE);
$offsets = array();
foreach ($matches as $match) {
$offsets[] = $match[1];
}
sort($offsets);
Run Code Online (Sandbox Code Playgroud)
换句话说,最后sort($offsets)是保证浪费周期吗?
如果它不会让我因为询问相关但可能是单独的问题而陷入困境,如果排序可能有用,那么采用SORT_REGULAR如图所示的默认标志或者SORT_NUMERIC明确指定是否会更多/更少/更有效内部产生的抵消preg_match_all必然是数字?
关于字符串偏移顺序的问题:
完全匹配应始终采用升序字符串偏移顺序.PHP使用循环实现全局匹配,该循环start_offset
在最近的完整匹配结束时设置,直到主题字符串结束.也就是说,它找到第一个匹配,然后是第二个匹配,然后是第三个匹配,依此类推.
如果您想验证我不可怕误读的源代码(或缺少的东西显著),你可以看一下函数
php_pcre_match_impl在ext/pcre/php_pcre.c. preg_match_all将全局参数设置为1.让我了解的是do while循环结束时的注释global:
/*Advance to the position right after the last full match*/
start_offset = offsets[1];
Run Code Online (Sandbox Code Playgroud)
如果设置了global,则循环将以新偏移量重复,并pcre_exec再次使用它进行调用.
关于您的SORT_NUMERIC问题:
很难说.设置SORT_NUMERIC使用sort numeric_compare_function进行元素比较,SORT_REGULAR使用时compare_function.
compare_function做一个类型检查,然后决定从那里做什么比较,而numeric_compare_function只是盲目地将两者转换为
doubles.两者都是LONG,compare_function只需比较它们而不进行任何转换.所以它最终将取决于哪个更快:盲目地转换为double,或执行类型检查.