21
if (strpos(htmlentities($storage->getMessage($i)),'chocolate')) 

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

4

3 回答 3

33

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

笔记:

如果您只想确定某个特定的针是否出现在 haystack 中,请改用更快且内存占用更少的函数 strpos()。

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

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

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

这是因为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

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

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

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

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

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

于 2010-10-06T17:26:45.190 回答
2

strpos可能比preg_match和在这种情况下的替代方案更快,最好的想法是用真实的示例数据做一些你自己的基准测试,看看什么最适合你的需求,尽管这可能是过度的。在它开始成为问题之前不要太担心性能

于 2010-10-06T15:31:45.233 回答
1

strpos 返回字符串第一次出现的开始位置,如果没有匹配将返回 Null,因此该语句是相当可用的。

if (!is_null(strpos($storage->getMessage($i),'chocolate'))
于 2018-09-26T13:18:53.213 回答