【问题标题】:php - Is strpos the fastest way to search for a string in a large body of text?php - strpos 是在大量文本中搜索字符串的最快方法吗?
【发布时间】:2011-04-21 21:42:09
【问题描述】:
if (strpos(htmlentities($storage->getMessage($i)),'chocolate')) 

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

【问题讨论】:

  • 必须将严格比较运算符与strpos() 函数一起使用。这是因为它可能会返回一个整数0,这意味着在字符串的开头找到了字符串'chocolate'。使用您拥有的声明,这将评估为FALSE。正确的是if (strpos(htmlentities($storage->getMessage($i)), 'chocolate') !== FALSE)
  • 你为什么使用htmlentities()?它会减慢一切。
  • 因为我也在搜索它是否在 html 中 - 如果我删除了 htmlentities 标签,是否会考虑链接 url?
  • 例如:chocoloatefactory.com">Bob's Site - 如果我省略了 htmlentities,这还会返回 true 吗?
  • htmlentities 不会更改任何内容,只会更改引号等特定字符。最好确保它们也没有在您正在搜索的字符串中编码,并且在这种情况下不要使用该函数。对于您的示例字符串“巧克力”,实体没有区别。

标签: php string hash string-search


【解决方案1】:

strpos返回字符串第一次出现的开始位置,如果没有匹配则返回Null,所以语句相当可用。

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

【讨论】:

  • 也许您应该考虑重新格式化您的帖子,以便更容易理解什么是代码,什么不是。
【解决方案2】:

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

注意:

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

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

虽然你的陈述应该做两处改变。

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

这是因为if(0) 的计算结果为假(因此不会运行),但是如果针位于大海捞针的最开始(位置 0),strpos() 可以返回 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 实体。不比较。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这已经有点问题了。我正在尝试快速搜索此字符串是用户的电子邮件收件箱,并且大约需要 2 秒来整理一封电子邮件。我想把这个数字减少到至少半秒。
    • 您确定瓶颈在 strpos 中,还是在收件箱搜索中?如果您使用 imap,请告诉我,我可能会提供更多帮助。
    猜你喜欢
    • 2016-10-25
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2014-03-23
    相关资源
    最近更新 更多