2

今天我只需要知道str_replace使用哪些字符串匹配算法。我刚刚分析了php源码,这个函数在ext\standard\string.c. 我刚发现php_char_to_str_ex。谁能告诉我这个函数是用什么算法写的?(哪些算法实现str_replace了这个功能)。

我只想实现一个使用周日算法的亮点程序(非常快速的算法,他们只说这个算法)

所以我认为这个功能str_replace可能符合我的目标,所以我只是分析了它,但是我的 C 太差了,所以请帮助我。

4

2 回答 2

7

简短的回答:这只是一个简单的蛮力搜索。

str_replace函数实际上只是一个转发器php_str_replace_common。对于主题不是数组的简单情况,依次调用php_str_replace_in_subject. 同样,当搜索参数只是一个字符串,并且超过 1 个字符时,调用php_str_to_str_ex.

php_str_to_str_ex实现来看,有各种特殊情况需要处理。

  1. 如果搜索字符串和替换字符串的长度相同,则内存处理会更容易,因为您知道结果字符串和源字符串的大小相同。
  2. 如果搜索字符串比源字符串长,你知道它永远不会找到任何东西,所以你可以简单地返回源字符串不变。
  3. 如果搜索字符串长度与源字符串长度相同,那么它只是一个直接比较。

但在大多数情况下,它归结为反复调用php_memnstr以查找下一个匹配项,并将该匹配项替换为memcpy.

至于php_memnstr实现,它只是memchr重复调用 C 来尝试匹配搜索字符串的第一个字符,然后memcmp查看字符串的其余部分是否匹配。

没有花哨的搜索字符串预处理来优化重复搜索。这只是一个简单的蛮力搜索。

我应该补充一点,即使主题是一个数组,并且预处理搜索字符串会有优势,代码也不会做任何不同的事情。它只调用php_str_replace_in_subject数组中的每个字符串。

于 2013-05-30T13:05:24.363 回答
1

是的,截至目前(2015 年 3 月),我在 PHP 源代码中看到该str_replace()函数依赖于周日字符串匹配算法。

str_replace()使用Sunday 算法的函数用途zend_memnstr_ex_pre()zend_memnstr_ex()函数(来自zend_operators.c文件)。

于 2015-03-24T08:07:23.880 回答