今天我只需要知道哪些字符串匹配算法str_replace
使用。我刚刚分析了php源代码,这个函数在ext\standard\string.c
。我刚发现php_char_to_str_ex
。谁能告诉我这个函数是用哪种算法编写的? (哪些算法实现了str_replace
这个功能。)
我只是想实现一个使用星期日算法的高亮程序(非常快速的算法,他们只说这个算法)
所以我认为这个函数str_replace
可能符合我的目标,所以我只是对它进行了分析,但是我的C很差,所以请各位帮帮我。
答案 0 :(得分:7)
简短回答:这只是一次简单的蛮力搜索。
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
实现,只是反复调用C memchr
来尝试匹配搜索字符串的第一个字符,然后memcmp
查看字符串的其余部分匹配。
搜索字符串没有花哨的预处理来优化重复搜索。这只是一种直截了当的蛮力搜索。
我应该补充一点,即使主题是一个数组,并且预处理搜索字符串会有一个优势,代码也没有做任何不同的事情。它只是为数组中的每个字符串调用php_str_replace_in_subject
。
答案 1 :(得分:1)
是的,截至目前(2015年3月)我在PHP源代码中看到str_replace()
函数依赖于星期日字符串匹配算法。
str_replace()
函数使用使用Sunday algorithm的zend_memnstr_ex_pre()
和zend_memnstr_ex()
函数(来自zend_operators.c
文件)。