为什么同时使用str_replace()和preg_replace()?

时间:2009-12-16 20:23:11

标签: php regex algorithm string performance

我在Perl之后认识PHP,所以当我第一次找到preg_ *函数时,我基本上只是使用了那些。后来我读到str_replace()在处理文字文本时速度更快。所以我的问题是,当搜索模式不使用特殊字符时,preg_replace()不能像str_replace()一样高效吗?也许只是分析模式以在正则表达式和纯文本算法之间进行选择?

8 个答案:

答案 0 :(得分:7)

理论上是的,你是对的。 PHP团队可能会跳过preg_replace来分析传入的模式,然后如果没有看到任何元字符,则使用str_replace的代码。假设分析不是太重,那么可能会产生更好的性能结果。

然而,PHP源代码(即用于实现PHP的代码)的组织方式并不适合这种共享。 PHP(在某些方面)不是一种完整的语言,而是更多的模块集合。

所以,最初PHP小组选择远离这种交叉模块授粉。此时,更改preg_replace函数以进行此类分析可能会破坏大量代码,并且性能改进将是微不足道的。

最后,分析本身比你想象的更难解决。告诉我,这种模式

 '/123/'

意思是我应该搜索文字文本

123

或文字

/123/

很容易为这两种解释提出令人信服的论据,这引入了使用该函数的额外混乱程度。

理论上一个有趣的想法,但在实践和PHP世界的上下文中,它产生的问题远远多于它解决的问题。

答案 1 :(得分:5)

  

也许只是分析模式   在正则表达式和纯文本之间进行选择   算法

每次我只想替换一些子串时,我宁愿不被强制转义正则表达式中具有特殊含义的所有内容。

答案 2 :(得分:0)

我认为速度产生的差异与正则表达式解析器/引擎的开销相比,与str_ *的运行方式相比。但我只是在这里猜测。如有疑问,请参考基准,看看它是否可以更快或更快:)

有一篇关于Regular Expression Matching Speed的冗长而详细的文章,维基百科有一些关于Implementations and Running timesComparison of Regular Expression engines的信息。

答案 3 :(得分:0)

尽管有相似之处,但两种功能都完全不同,因此不可互换。例如,preg_replace中的替换可以包含对正则表达式捕获的文本的反向引用:

preg_replace ('/(\w+) apple/', '$1 pear', 'A red apple'); // => 'A red pear'

答案 4 :(得分:0)

这是它在javascript中的工作原理

alert("a.b".replace(".", "X")) // aXb
alert("a.b".replace(/./, "X")) // X.b

也就是说,一个函数可以接受子字符串和特殊的正则表达式文字。 Regexp文字非常方便,整个字符串库可以变得更小,更灵活(想象一个split而不是“explode”和“preg_split”,pos而不是“strpos”和“preg_match” “等)。

话虽如此,我非常怀疑regexp文字可以很快添加到php。

答案 5 :(得分:0)

  

也许只是分析模式以在正则表达式和纯文本算法之间进行选择?

仅此一项会降低性能。此外,preg_*()函数使用的库不是更简单的字符串操作所必需的。

答案 6 :(得分:0)

无法用str_replace()替换preg_replace(),因为如果我尝试使用模式匹配或正常的字符串替换,函数无法理解。如果新函数接受新参数,则可以这样做,但在这种情况下,您将为旧代码引入不兼容问题。

更改preg_replace()以使其理解应该更换字符串不会使其优化。它应检查作为参数传递的字符串,并了解我要求用另一个字符串替换字符串;检查是否需要时间来解决模式匹配问题。

答案 7 :(得分:-1)

preg适用于复杂的文本替换(文本超链接到实际链接)。另一种是用于改变单词(如文字过滤器)。

如果您有可以与模式匹配的空白,请使用preg,否则尝试使用str_replace。

虽然尝试使用str_replace在preg中执行相同的操作,但如果你正在做复杂的事情,实际上会更慢。