php str_replace是用什么字符串匹配算法写的?

时间:2013-05-30 11:49:33

标签: php string algorithm highlight matching

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

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

所以我认为这个函数str_replace可能符合我的目标,所以我只是对它进行了分析,但是我的C很差,所以请各位帮帮我。

2 个答案:

答案 0 :(得分: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. 如果搜索字符串长度与源字符串长度相同,则只是直接比较。
  4. 但在大多数情况下,它归结为反复调用php_memnstr来查找下一个匹配项,并将该匹配项替换为memcpy

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

    搜索字符串没有花哨的预处理来优化重复搜索。这只是一种直截了当的蛮力搜索。

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

答案 1 :(得分:1)

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

str_replace()函数使用使用Sunday algorithmzend_memnstr_ex_pre()zend_memnstr_ex()函数(来自zend_operators.c文件)。