我需要测试是否有任何字符串 '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/