使用preg_replace截断字符串的最有效方法?

时间:2012-11-30 23:04:00

标签: php regex string performance

我正在查看一些代码并开始考虑使用preg_replace截断字符串(在本例中为URI)的最有效方法。

首先 - 我意识到首先使用preg_replace对于这个任务来说可能是过度的,它可能是不必要的昂贵,并且最好使用PHP的字符串友好函数来处理它,例如{{ 1}}。我知道这一点。

那就是说,考虑这两种不同的正则表达式:

substr

默认情况下,我认为在前一种情况下,创建后引用会比不这样做更昂贵,因此第二个例子更可取。但后来我开始想知道在第二个例子中使用$uri = '/one/cool/uri'; // Desired result '/one/cool' // Using a back-reference $parent = preg_replace('#(.*)/.*#', "$1", $uri); // Using character class negation $parent = preg_replace('#/[^/]+$#', '', $uri); 可能比第一个例子中相应的[^/]更昂贵,如果是这样,还有多少?

从可读性的角度来看,我更喜欢第一个例子,因为我们分裂了头发,所以我倾向于在两者之间选择它(毕竟,编写可读代码也很有价值)。可能只是我个人的偏好。

思想?

1 个答案:

答案 0 :(得分:2)

我还会测量两个选项的运行时间。来自文档的这些信息也可能有所帮助:

http://www.php.net/manual/en/regexp.reference.performance.php

  

如果您使用的主题字符串不包含换行符,则可以通过设置PCRE_DOTALL或使用^。*启动模式来指示显式锚定来获得最佳性能。这样可以使PCRE不必扫描主题,寻找新行重新开始。

因此,$parent = preg_replace('#^(.*)/.*#s', "$1", $uri);可能会加速第一个选项。第二个不需要这个设置:

  

s(PCRE_DOTALL)

     

如果设置了此修饰符,则会出现点元字符   pattern匹配所有字符,包括换行符。没有它,   新线被排除在外。此修饰符等效于Perl's / s   修改。 [^ a]等否定类始终与换行符匹配   字符,与此修饰符的设置无关。