我需要测试是否有任何字符串 '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/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
我需要一个通过输入字符串进行计算的方法,像这样function="(a/b)*100"a=25b=50function.something>>50有什么方法吗? 最佳答案 您可以使用instance_eval:function="(a/b)*100"a=25.0b=50instance_evalfunction#=>50.0请注意,使用eval本质上是不安全的,尤其是当您使用外部输入时,因为它可能包含注入(inject)的恶意代码。另请注意,a设置为25.0而不是25,因为如果它是整数a/b将导致0(整数)。
我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋