顺序strpos()比一个preg_match的函数更快?

Moh*_*mad 4 php string optimization performance search

我需要测试是否有任何字符串'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;}
Run Code Online (Sandbox Code Playgroud)

还是一个preg_match?

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

我知道preg_match代码是错误的,如果有人能提供正确的版本,我真的很感激.

谢谢!


回答

请阅读cletus所说的内容和测试middaparka吼叫.我还做了一个mirco时间测试,在各种字符串,长短.有了这些结果

如果,您知道字符串值发生的概率从最可能到最小可能.(我没有注意到在命令正则表达式本身时,即在/hello|i am|dumb/或之间存在明显的不同/i am|dumb|hello/.

另一方面,在连续的strpos中,概率完全不同.例如,如果"你好"发生率为90%,"我是"7%,"哑巴"发生率为3%.您想组织代码以先检查'hello'并尽快退出该功能.

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

对于在第一,第二和第三次strpos()执行中分别找到针的干草堆A,B和C,时间如下,

strpos:
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()

正如数字显示的那样,strpos在4rth执行时速度更快,因此我将使用它而不是因为我只有3个子命令来检查:)

cle*_*tus 7

正确的语法是:

preg_match('/hello|i am|dumb/', $ohreally);
Run Code Online (Sandbox Code Playgroud)

我怀疑其中有多少内容,但如果strpos()方法更快,取决于您要搜索的字符串数量,我不会感到惊讶.strpos()随着搜索项数量的增加,性能将下降.正则表达式可能会但不会那么快.

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

preg_match('/\b(hello|i am|dumb)\b/', $ohreally);
Run Code Online (Sandbox Code Playgroud)

这更难做到strpos().

注意:技术上\b是零宽度字边界."零宽度"表示它不消耗输入字符串的任何部分,字边界意味着它匹配字符串的开头,字符串的结尾,从字(数字,字母或下划线)字符到非字符的转换单词字符或从非单词到单词字符的转换.很有用.

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

if (strpos ($ohreally, 'hello')) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果针位于字符串中的位置0,则不会进入条件块.正确的用法是:

if (strpos ($ohreally, 'hello') !== false) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

因为类型杂耍.否则0将转换为false.