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

2022-08-30 19:56:07
if (strpos(htmlentities($storage->getMessage($i)),'chocolate')) 

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


答案 1

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

注意:

如果您只想确定特定针是否出现在大海捞针中,请改用更快、内存较少的函数 strpos()。

在任何关于其他字符串比较器 php.net 文章中都一次又一次地引用了这一点(我从strstr())

尽管应该对您的陈述进行两项更改。

if (strpos($storage->getMessage($i),'chocolate') !== FALSE)

这是因为计算结果为 false(因此不运行),但是如果针在大海捞针的最开始(位置 0),则可以返回 0。此外,删除将使代码运行得更快。所有需要做的就是将某些字符替换为相应的 HTML 等效项。例如,它将每个替换为if(0)strpos()htmlentities()htmlentities()&&

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

strpos('Billy & Sally', '&'); // 6
strpos('Billy & Sally', '&'); // 6
strpos('Billy & Sally', 'S'); // 8
strpos('Billy & Sally', 'S') // 12

或者,在最坏的情况下,你甚至可能导致某些真的东西被评估为假。

strpos('<img src...', '<'); // 0
strpos('&lt;img src...','<'); // FALSE

为了规避这一点,你最终会使用更多的HTML实体。

strpos('&lt;img src...', '&lt;'); // 0

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


答案 2

strpos可能比preg_match更快,在这种情况下,最好的主意是用真实的示例数据做一些自己的基准测试,看看什么最适合你的需求,尽管这可能做得过头了。不要太担心性能,直到它开始成为一个问题


推荐