我正在查看一些代码并开始考虑使用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);
可能比第一个例子中相应的[^/]
更昂贵,如果是这样,还有多少?
从可读性的角度来看,我更喜欢第一个例子,因为我们分裂了头发,所以我倾向于在两者之间选择它(毕竟,编写可读代码也很有价值)。可能只是我个人的偏好。
思想?
答案 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]等否定类始终与换行符匹配 字符,与此修饰符的设置无关。