if (strpos(htmlentities($storage->getMessage($i)),'chocolate'))
嗨,我正在使用 gmail oauth 访问来查找电子邮件地址中的特定文本字符串。有没有一种方法可以比在上面的代码中使用 strpos 更快、更有效地查找文本实例?我应该使用哈希技术吗?
根据 PHP 手册,是的 -
strpos()
是确定一个字符串是否包含另一个字符串的最快方法。
注:
如果您只想确定特定的针是否出现在干草堆中, 请使用速度更快且内存占用更少的函数 strpos() 来代替。
任何关于其他字符串比较器的 php.net 文章都多次引用了这一点(我从
strstr()
中提取了这个)
尽管您的陈述应进行两处更改。
if (strpos($storage->getMessage($i),'chocolate') !== FALSE)
这是因为
if(0)
的计算结果为 false(因此不会运行),但是如果针位于干草堆的最开始(位置 0),则 strpos()
可以返回 0。另外,删除 htmlentities()
将使您的代码运行得更快。 htmlentities()
所做的就是用相应的 HTML 等效项替换某些字符。例如,它将每个 &
替换为 &
正如您可以想象的那样,单独检查字符串中的每个字符并替换其中的许多字符需要额外的内存和处理器能力。不仅如此,如果您打算只进行文本比较,则没有必要。例如,比较以下陈述:
strpos('Billy & Sally', '&'); // 6
strpos('Billy & Sally', '&'); // 6
strpos('Billy & Sally', 'S'); // 8
strpos('Billy & Sally', 'S') // 12
或者,在最坏的情况下,你甚至可能导致 true 的结果变为 false。
strpos('<img src...', '<'); // 0
strpos('<img src...','<'); // FALSE
为了规避这个问题,您最终会使用更多的 HTML 实体。
strpos('<img src...', '<'); // 0
但是,正如您可以想象的那样,这不仅让代码变得烦人,而且变得多余。您最好完全排除 HTML 实体。通常,HTML 实体仅在输出文本时使用。不比较。
strpos 可能比 preg_match 和这种情况下的替代方案更快,最好的想法是用真实的示例数据做一些你自己的基准测试,看看什么最适合你的需求,尽管这可能有点过头了它。不要太担心性能,直到它开始成为问题
2024 年更新,
如果运行 php 8,看起来 str_contains 是更快的方法。
strpos()返回字符串第一次出现的开始位置,如果没有匹配将返回Null,所以语句相当有用。
if (!is_null(strpos($storage->getMessage($i),'chocolate'))) {}