加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

php – preg_offset_capture子数组的保证顺序*保证*增加偏移量?

发布时间:2020-05-25 09:47:47 所属栏目:PHP 来源:互联网
导读:我没有能够找到一个权威的答案,尽管我99.9%确定这是真的.像接受的 answer这样的事情依赖于它是正确的,因为我希望许多其他代码.但是,真正了解preg_match_all(不是通过观察,但是通过指定要求或指定算法)的人可以确认这是有保证的行为吗?我无法从文件中收集.

我没有能够找到一个权威的答案,尽管我99.9%确定这是真的.像接受的 answer这样的事情依赖于它是正确的,因为我希望许多其他代码.但是,真正了解preg_match_all(不是通过观察,但是通过指定要求或指定算法)的人可以确认这是有保证的行为吗?我无法从文件中收集.

我的用例非常简单:

preg_match_all("/$regexp/",$content,$matches,PREG_OFFSET_CAPTURE);

我知道$regexp不包含任何子模式,所以文档告诉我,$matches [0]将是一个2元素数组的数组,其中每个子数组都有数字键0的元素,其中包含一个字符串,匹配模式,数字键1包含偏移量到匹配发生的$内容.而尽管数组元素通过增加偏移量来排序似乎是合理的,但我看不到需要哪里,因此如果不是这样,它将是一个错误.虽然我无法想象如何做到有用的效果,也许可能有一些方法来实现preg_match_all与多个线程附加他们的部分结果,而不合并到完全排序的顺序.

在我特定的情况下,我只关心偏移量,而不是匹配的字符串,但关键是偏移量增加.所以用腰带和吊带的心态我编码:

preg_match_all("/$regexp/",PREG_OFFSET_CAPTURE);
$offsets = array();
foreach ($matches as $match) {
    $offsets[] = $match[1];
}
sort($offsets);

那么换另一种方式,是最终的排序($offsets)一个有保证的循环浪费?

如果不能让我遇到一个相关但可能单独的问题的深度麻烦,如果这种排序有潜力,那么如果显示出默认的SORT_REGULAR标志,或是明确指定SORT_NUMERIC,那么它/由于preg_match_all中产生的偏移量必须是数值?

关于你的字符串偏移顺序的问题:

完全匹配应始终以字符串上升顺序排列. PHP实现与设置start_offset的循环的全局匹配
在最近的完整匹配结束,直到主题字符串的结尾.那就是找到第一场比赛,然后是第二场比赛
第三,等等.

如果你想验证我是不是很可能会误读源代码(或者丢失一些重要的东西),你可以查看这个函数
ext / pcre / php_pcre.c中的php_pcre_match_impl. preg_match_all将全局参数设置为1.最终引起了我的注意
的while循环为全局:

/*Advance to the position right after the last full match*/
start_offset = offsets[1];

如果设置了全局,则循环将重新使用新的偏移量,并再次调用pcre_exec.

关于您的SORT_NUMERIC问题:

很难说设置SORT_NUMERIC使排序使用numeric_compare_function进行元素比较,其中SORT_REGULAR使用compare_function.

compare_function做一个类型检查,然后决定从那里做比较,而numeric_compare_function只是盲目地转换成双打.比较两个都是比较的,只是比较它们而不做任何转换.所以它最终将取决于哪个更快:盲目转换为双倍,或执行类型检查.

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读