我需要测试名为$ohreally的长字符串中是否存在任何字符串“hello”、“i am”、“dumb”,如果其中一个字符串存在,我的测试就结束了,我知道如果其中一个字符串存在,其他字符串都不会出现。
在这种情况下,我请求你的帮助,以最有效的方式来写这个搜索,
strps()是这样的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;}

还是一场比赛?
if (preg_match('hello'||'i am'||'dumb', $ohreally)) {return false}
   else {return true};

我知道preg_匹配代码是错误的,如果有人能提供正确的版本,我将非常感激。
谢谢您!
回答
请读一下克莱特斯说的话,米德帕卡做的测试如下。我还做了一个和平号时间测试,在各种弦上,长的和短的。有了这些结果
如果,您知道字符串值发生的概率是从最有可能到最小的。(我没有注意到在对regex本身排序(即在/hello|i am|dumb//i am|dumb|hello/之间)方面有明显的不同。
另一方面,在序列strpos中,概率决定了一切。例如,如果“hello”出现了90%,“i am”出现了7%,而“dumb”出现了3%。您希望先组织代码以检查“hello”,然后尽快退出该函数。
我的微时测试显示了这一点。
对于分别在第一次、第二次和第三次strps()执行时发现针头的草堆A、B和C,时间如下:
斯特罗普斯:
A:0.00450秒//1 strps()
B:0.00911秒//2秒()
C:0.00833秒//3秒()
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在第4次执行时速度更快,因此我将使用它,因为我只有3个要检查的子刺:)

最佳答案

正确的语法是:

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

我怀疑这两种方法都有很多优点,但如果strpos()方法根据您搜索的字符串数量更快,我也不会感到惊讶。随着搜索词数量的增加,strpos()的性能将下降。regex可能会,但不会那么快。
显然正则表达式更强大。例如,如果您想匹配“dumb”一词而不是“dumber”,那么可以很容易地使用:
preg_match('/\b(hello|i am|dumb)\b/', $ohreally);

这对strpos()来说要困难得多。
注意:从技术上讲,\b是一个零宽度的单词边界。”“零宽度”表示它不使用输入字符串的任何部分,单词边界表示它匹配字符串的开头、字符串的结尾、从单词(数字、字母或下划线)字符到非单词字符的转换或从非单词到单词字符的转换。非常有用。
编辑:值得注意的是,您使用的strpos()是不正确的(但是很多人都会犯同样的错误)。即:
if (strpos ($ohreally, 'hello')) {
  ...
}

如果针位于字符串中的0位置,则不会进入条件块。正确用法是:
if (strpos ($ohreally, 'hello') !== false) {
  ...
}

因为玩杂耍。否则0将转换为false。

09-28 10:56