php - strpos是在大量文本中搜索字符串的最快方法吗?

Bob*_*zza 16 php string hash string-search

if (strpos(htmlentities($storage->getMessage($i)),'chocolate')) 
Run Code Online (Sandbox Code Playgroud)

嗨,我正在使用gmail oauth访问权限来查找电子邮件地址中的特定文本字符串.有没有办法比在上面的代码中使用strpos更快更有效地查找文本实例?我应该使用哈希技术吗?

ste*_*esu 29

根据PHP手册,strpos()是 - 是确定一个字符串是否包含另一个字符串的最快方法.

注意:

如果您只想确定特定针是否出现在haystack中,请使用更快且内存更少的内存密集型函数strpos().

这是在任何关于其他字符串比较器的php.net文章中引用的一次又一次(我从中提取了这个strstr())

虽然您的陈述应该有两处更改.

if (strpos($storage->getMessage($i),'chocolate') !== FALSE)
Run Code Online (Sandbox Code Playgroud)

这是因为if(0)评估为假(因此不运行),但是strpos()如果针位于干草堆的最开始(位置0),则可以返回0.此外,删除htmlentities()将使您的代码运行更快.所有这一切htmlentities()确实是与他们相应的HTML等同替换某些字符.例如,它会替换每个&&

可以想象,单独检查字符串中的每个字符并替换其中的许多字符需要额外的内存和处理器能力.不仅如此,如果您计划进行文本比较,则没有必要.例如,比较以下语句:

strpos('Billy & Sally', '&'); // 6
strpos('Billy & Sally', '&'); // 6
strpos('Billy & Sally', 'S'); // 8
strpos('Billy & Sally', 'S') // 12
Run Code Online (Sandbox Code Playgroud)

或者,在最坏的情况下,您甚至可能会将某些内容评为假.

strpos('<img src...', '<'); // 0
strpos('&lt;img src...','<'); // FALSE
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况,你最终会使用更多的HTML实体.

strpos('&lt;img src...', '&lt;'); // 0
Run Code Online (Sandbox Code Playgroud)

但是,正如您可以想象的那样,这不仅令代码烦恼,而且变得多余.你最好完全排除HTML实体.通常,HTML实体仅在您输出文本时使用.不比较.