今天我只需要知道str_replace
使用哪些字符串匹配算法。我刚刚分析了php源码,这个函数在ext\standard\string.c
. 我刚发现php_char_to_str_ex
。谁能告诉我这个函数是用什么算法写的?(哪些算法实现str_replace
了这个功能)。
我只想实现一个使用周日算法的亮点程序(非常快速的算法,他们只说这个算法)
所以我认为这个功能str_replace
可能符合我的目标,所以我只是分析了它,但是我的 C 太差了,所以请帮助我。
简短的回答:这只是一个简单的蛮力搜索。
该str_replace
函数实际上只是一个转发器php_str_replace_common
。对于主题不是数组的简单情况,依次调用php_str_replace_in_subject
. 同样,当搜索参数只是一个字符串,并且超过 1 个字符时,调用php_str_to_str_ex
.
从php_str_to_str_ex
实现来看,有各种特殊情况需要处理。
但在大多数情况下,它归结为反复调用php_memnstr
以查找下一个匹配项,并将该匹配项替换为memcpy
.
至于php_memnstr
实现,它只是memchr
重复调用 C 来尝试匹配搜索字符串的第一个字符,然后memcmp
查看字符串的其余部分是否匹配。
没有花哨的搜索字符串预处理来优化重复搜索。这只是一个简单的蛮力搜索。
我应该补充一点,即使主题是一个数组,并且预处理搜索字符串会有优势,代码也不会做任何不同的事情。它只调用php_str_replace_in_subject
数组中的每个字符串。
是的,截至目前(2015 年 3 月),我在 PHP 源代码中看到该str_replace()
函数依赖于周日字符串匹配算法。
str_replace()
使用Sunday 算法的函数用途zend_memnstr_ex_pre()
和zend_memnstr_ex()
函数(来自zend_operators.c
文件)。