php - 顺序 strpos() 比具有一个 preg_match 的函数更快?

标签 php string optimization search performance

我需要测试是否有任何字符串 'hello'、'i am'、'dumb' 存在于称为 $ohreally 的较长字符串中,如果其中一个存在,我的测试就结束了,我有知道如果其中一个发生,其他两个都不会发生。

在这种情况下,我请求您帮助以最有效的方式编写此搜索,

strpos() 像这样 3 次?

if (strpos ($ohreally, 'hello')){return false;}  
   else if (strpos ($ohreally, 'i am')){return false;}  
   else if (strpos ($ohreally, 'dumb')){return false;}  
   else {return true;}

还是一个 preg_match?

if (preg_match('hello'||'i am'||'dumb', $ohreally)) {return false}   
   else {return true};

我知道 preg_match 代码是错误的,如果有人能提供它的正确版本,我将不胜感激。

谢谢!


回答

请阅读 cletus 所说的内容和下面的测试 middaparka 所做的。我还对各种长弦和短弦进行了微时测试。有了这些结果

如果,您知道字符串值出现的概率,请按从大到小的顺序排列它们。 (我没有注意到正则表达式本身的排序有明显的不同,即在 /hello|i am|dumb//i am|dumb|hello/ 之间。

另一方面,在顺序 strpos 中,概率会造成所有差异。例如,如果出现“你好”的概率为 90%,出现“我是”的概率为 7%,出现“笨蛋”的概率为 3%。你想组织你的代码首先检查'hello'并尽快退出该功能。

我的 microtime 测试显示了这一点。

分别在第一次、第二次、第三次执行strpos()时找到针的大海捞针A、B、C,时间如下,

正位:
A: 0.00450 秒//1 strpos()
B: 0.00911 秒//2 strpos()
C: 0.00833 秒//3 strpos()
C: 0.01180 秒//4 strpos() 额外加了一个

对于preg_match:
A: 0.01919 秒//1 preg_match()
B: 0.02252 秒//1 preg_match()
C: 0.01060 秒//1 preg_match()

如数字所示,在第 4 次执行之前 strpos 速度更快,所以我将改用它,因为我只有 3 个子 stings 要检查:)

最佳答案

正确的语法是:

preg_match('/hello|i am|dumb/', $ohreally);

我怀疑其中的任何一种方式都有很多,但如果 strpos() 方法根据您正在搜索的字符串数量更快,我也不会感到惊讶。 strpos() 的性能会随着搜索项数量的增加而降低。正则表达式可能会,但不会那么快。

显然正则表达式更强大。例如,如果你想匹配单词“dumb”而不是“dumber”,那么这很容易完成:

preg_match('/\b(hello|i am|dumb)\b/', $ohreally);

strpos() 做起来要困难得多。

注意:从技术上讲,\b 是零宽度字边界。 “零宽度”意味着它不消耗输入字符串的任何部分,单词边界意味着它匹配字符串的开头、字符串的结尾、从单词(数字、字母或下划线)字符到非-单词字符或从非单词字符到单词字符的过渡。非常有用。

编辑:还值得注意的是,您对 strpos() 的使用不正确(但很多人都犯了同样的错误)。即:

if (strpos ($ohreally, 'hello')) {
  ...
}

如果指针在字符串中的位置0,则不会进入条件 block 。正确的用法是:

if (strpos ($ohreally, 'hello') !== false) {
  ...
}

因为类型杂耍。否则 0 被转换为 false。

关于php - 顺序 strpos() 比具有一个 preg_match 的函数更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2093535/

相关文章:

php - 解析字符串 - 从字符串中删除一些单词

C程序,设计支票

c++ - 复制整数位的最快方法

c# - 与 2 UserProfileValueCollection 进行比较的更快方法

c++ - 在多线程中添加到 vector

php - 'PDOException' 消息 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ' 214748364 7' for key ' contact_no'

java - isEmpty 和等于 (""之间的区别)

php - Backblaze Storage B2 PHP 从私有(private)桶授权下载

php - 没有重复条目时的mysql重复条目错误(通过php批量加载)

php - 使用不同的列名插入到 mysql 和 postgresql