我在Perl之后认识PHP,所以当我第一次找到preg_ *函数时,我基本上只是使用了那些。后来我读到str_replace()
在处理文字文本时速度更快。所以我的问题是,当搜索模式不使用特殊字符时,preg_replace()
不能像str_replace()
一样高效吗?也许只是分析模式以在正则表达式和纯文本算法之间进行选择?
答案 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 times和Comparison 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中执行相同的操作,但如果你正在做复杂的事情,实际上会更慢。
乔