我已经使用 PHP 编写代码一段时间了,我一直在读到您应该只在必须时使用 preg_match 和 preg_replace,因为这会降低性能。为什么是这样?在一个文件中使用 20 个 preg_matches 而不是使用另一个 PHP 函数真的很糟糕吗?
最佳答案
正如 Mike Brant 在他的回答中所说:使用任何 preg_* 函数都没有错,如果您需要它们。
您想知道在单个文件中进行 20 次 preg_match 调用是否是个好主意,老实说:我会说这太多了。我经常说 “如果您的问题解决方案在任何给定时间依赖于 3 个以上的正则表达式,那么您就是问题的一部分”。不过,我偶尔也会犯下自己的口头禅。
如果您正在使用 20 个 preg_match 调用,您很可能只需仔细查看实际的正则表达式即可将这个数字减半。正则表达式,尤其是 Perl 正则表达式,非常强大,非常值得花时间去了解它们。 为什么它们往往变慢的原因仅仅是因为必须解析正则表达式,并在某个低级别“翻译”到相当数量的分支和循环。比方说,如果您想用大写字符替换所有小写的 a,您当然可以使用正则表达式,但在 PHP 中它看起来像这样:
preg_replace('/a/','A',$string);
查看表达式,第一个参数:它是一个作为参数传递的字符串。该字符串将被解析(解析时,将检查分隔符,创建匹配字符串,然后迭代字符串,将每个字符与模式(在本例中为 a)进行比较,并且 如果子串匹配,它被替换。
看起来有点麻烦,特别是考虑到最后一步(比较子串和替换匹配)是我们真正想要的。
$string = str_replace('a','A',$string);
仅此而已,无需在解析和验证正则表达式时执行额外的检查。
不要忘记 preg_match 也构造了一个匹配数组,并且构造一个数组也不是免费的。
简而言之:正则表达式较慢,因为表达式被解析、验证并最终翻译成一组简单的低级指令。
请注意,在某些情况下,人们使用 explode 和 implode 进行字符串操作。这也创建了一个数组,它再次不是免费的。考虑到此后不久您将爆破同一个阵列。也许另一种选择更可取(在某些情况下,preg_replace 可以 在这里更快)。
基本上:正则表达式需要额外的处理,简单的字符串函数不需要。但是当有疑问时,只有一种方法可以绝对确定:设置测试脚本...
关于php - preg_match() 和 preg_replace() 慢吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14342427/
除了协议(protocol)定义中的斜杠('http[s]://'、'ftp://'等)之外,我想替换URL中的所有多个斜杠。我该怎么做?此代码无一异常(exception)地替换:url.gsub(/\/\/+/,'/') 最佳答案 您只需排除任何以:开头的匹配项url.gsub(/([^:])\/\//,'\1/') 关于ruby正则表达式:replacedoubleslashesinURL,我们在StackOverflow上找到一个类似的问题: http
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它
String#match和Regexp#match在匹配成功时返回一个MatchData:"".match(//)#=>#//.match("")#=>#//.match(:"")#=>#但是Symbol#match返回匹配位置(如String#=~)::"".match(//)#=>0为什么Symbol#match表现不同?有用例吗? 最佳答案 我将其报告为Ruby核心中的错误:https://bugs.ruby-lang.org/issues/11991.让我们看看他们会怎么说。更新被质疑的行为似乎是一个错误。似乎从Ruby2.
我对UTF-8编码有一些问题。我在这里阅读了一些帖子,但它仍然无法正常工作。这是我的代码:#!/bin/envruby#encoding:utf-8defdeterminefile=File.open("/home/lala.txt")file.eachdo|line|puts(line)type=line.match(/DOG/)puts('aaaaa')iftype!=nilputs(type[0])breakendendend这是我文件的前3行:;?lalalalal60000065535-1362490443-0000006334-0000018467-0000000041en
有人知道为什么我的rails3.0.7cli这么慢吗?当我运行railss或railsg时,他大约需要5秒才能真正执行命令...有什么建议吗?谢谢 最佳答案 更新:我正在将我的建议从rrails切换到rails-sh,因为前者支持REPL,而rrails不是用例。此外,当与ruby环境结合使用时,修补似乎确实可以提高性能变量,现在反射(reflect)在答案中。一个可能的原因可能是这个performancebuginruby每当在ruby代码中使用“require”时,它就会调用一些代码(更多详细信息here)。在使用Rai
在我的大多数应用程序中,我都有一个current_user方法。为了避免像current_user.name这样的情况出现异常,其中current_user是nil,rails提供了try方法。这个问题是我需要记住在current_user可能是nil的地方使用try。我想使用NullObject模式来消除这种额外的开销。classNullUserdefmethod_missing(method_name,*args)nilendenddefcurrent_userreturnNullUser.newunlessUserSession.find@current_user||=UserS
目录报错信息np.greater学习临时解决方法:np.greater去掉dtype报错信息pipinstallnumpy==1.24报错代码:dda=np.cumsum(np.greater(counts,0),dtype=np.int32)print(dda)Noloopmatchingthespecifiedsignatureandcastingwasfoundforufuncgreaternp.greater学习1.函数功能:判断参数一是否大于参数二。2.参数介绍 arr1:第一个参数类似一个数组 arr2:第二个参数类似一个数组 out:返回值是bool类型或者是元素为bool
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?
我很确定Ruby有这些(等同于__call、__get和__set),否则find_by将如何在Rails中工作?也许有人可以举一个简单的例子来说明如何定义与find_by相同的方法?谢谢 最佳答案 简而言之你可以映射__调用带有参数的method_missing调用__设置为方法名称以'='结尾的method_missing调用__获取不带任何参数的method_missing调用__调用PHPclassMethodTest{publicfunction__call($name,$arguments){echo"Callingob
Lisp是否适合Web编程/应用程序(交互式),就像ruby和php一样?需要考虑的事情是:易于使用可部署性难度(尤其是对于编程初学者而言)(编辑)在阅读PaulGraham'sessay之后,我特别提到了CommonLisp.将是我的第一门编程语言。在这方面。这样做合适吗?我听说Clojure的宏功能不如CommonLisp的强大,这就是我尝试学习Clojure的原因。它教授编程并且非常强大。 最佳答案 Lisp是一个语系,而不是单一的语言。为了稍微回答您的问题,是的,存在用于各种Lisp方言的Web框架,例如用于Common