我需要测试一个字符串“hello”、“I am”、“”是否存在于名为“”的较长字符串中,如果其中一个字符串存在,我的测试就结束了,而且我知道如果其中一个字符串已经存在,其他字符串都不会出现。
在这种情况下,我请求你帮助我找到最有效的方法来写这个搜索,
是这样的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说的话,看看测试小组做了什么。我还做了一个镜像时间测试,对各种字符串,长和短。有了这些结果
如果,您知道字符串值发生的概率从最可能到最小。(我没有注意到在排序正则表达式本身,即在/hello|i am|dumb/或/i am|dumb|hello/之间排序时,有一个很大的不同。
另一方面,在顺序strpos中,概率决定了所有的差异。例如,如果“你好”发生在90%,“我”7%,“哑巴”3%。您希望组织代码,首先检查“hello”,并尽快退出该函数。
我的微时间测试显示了这一点。
对于在第一、第二和第三次strpos()执行时分别找到针的海草A、B和C,时间如下,
strpos:
A: 0.00450秒/1 strpos()
B: 0.00911秒/2 strpos()
C: 0.00833秒/3 strpos()
C: 0.01180秒// 4strpos()增加一个额外的
对于preg_match:
A: 0.01919秒/1 preg_match()
B: 0.02252秒/1 preg_match()
C: 0.01060秒/1 preg_match()
如数字所示,strpos在第4 4rth执行之前更快,因此我将使用它,因为我只有3,子刺需要检查:)
发布于 2010-01-19 12:58:10
正确的语法是:
preg_match('/hello|i am|dumb/', $ohreally);我对这两种方法都有很多怀疑,但如果strpos()方法的速度更快,取决于您正在搜索的字符串的数量,我也不会感到惊讶。随着搜索词的增加,strpos()的性能会下降。大王可能会这么快,但不会那么快。
显然,正则表达式更强大。例如,如果您想匹配“哑”一词,而不是“蠢蛋”,那么这很容易用以下方法完成:
preg_match('/\b(hello|i am|dumb)\b/', $ohreally);这对strpos()来说要困难得多。
注:从技术上讲,是一个零宽度的单词边界.“零宽度”意味着它不消耗输入字符串的任何部分,单词边界意味着它匹配字符串的开头、字符串的结尾、从单词(数字、字母或下划线)字符到非单词字符的转换或从非单词字符到单词字符的转换。非常有用。
编辑:也值得注意的是,您对strpos()的使用是不正确的(但是很多人都犯了同样的错误)。即:
if (strpos ($ohreally, 'hello')) {
...
}如果指针位于字符串中的0位置,则不会进入条件块。正确的用法是:
if (strpos ($ohreally, 'hello') !== false) {
...
}因为类型杂耍。否则,0将转换为false。
发布于 2010-01-19 13:03:28
疯狂的想法,但是为什么不在两个单独的循环中测试两个'n‘千次,都被微时间()所包围;以及相关的调试输出。
基于上面对1,000次迭代的代码(有几处更正),我得到了如下内容:
strpos test: 0.003315
preg_match test: 0.014241因此,在这种情况下(有其他人概述的限制),strpos看起来确实更快,尽管数量很大程度上是没有意义的。(无意义的微观优化等joy )
从不估计你能测量到什么.
https://stackoverflow.com/questions/2093535
复制相似问题