根据一些测试,我发现了这个函数的这些重要特性。(这些
最好作为其规范的一部分进行记录,例如,为了确认。如果没有,
这只是实验性的好奇心。不过总比猜测好!;))
1. 更改会在回调之间级联到主题,即对主题进行的更改
回调将由下一个回调看到,如果其模式匹配
更改后的主题。
(但是 *相同* 回调的先前调用(在任何主题上)所做的更改
该回调将不再看到。)
2. 模式 + 回调对将按照它们出现的顺序应用
在 $patterns_and_callbacks 中。
3. 回调不能为 null(或 '')以快速替换为空。
4. 总的来说,算法开始迭代 $patterns_and_callbacks,然后
将每个 $subject 馈送到当前回调,对每个匹配重复
其在当前主题上的模式(与 "preg_match_all" 不同,后者
可以一次性完成,在数组中返回累积结果)。
这基本上意味着“皇冠上的明珠”,一个更有效的函数
"preg_replace_all_callback_array" 仍然缺少。
(当然,这更适合正则表达式 API 的新设计,其中一个
API 可以通过一些 $flags = [] 数组灵活地处理各种不同的模式。)
5. (最后一个并非特定于此函数,而是正则表达式固有的,另一方面,
它可能比 PHP 正则表达式支持中的任何其他地方都更相关。)
即使是看似简单的情况也会产生疯狂(且难以预测)
匹配数量,以及因此的回调调用,因此请记住设置
$limit,在可承受的情况下。但是,当然,首先尝试锐化你的模式!
例如使用 ^...$ 锚定以避免在匹配的子字符串上进行意外的额外调用
主题,(即 '/.*/',没有锚定,将匹配两次:一次匹配
整个主题,然后匹配尾随的空子字符串 - 但我不确定
这是否应该是正确的行为。)