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

Ric*_*dXu 2 php string algorithm highlight matching

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

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

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

Jam*_*ess 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数组中的每个字符串.