split or explode it?
刚才在社区里有人提问如果将帖子从<!--more-->
分割开,获得摘要和剩余内容。
有仁兄回答说用 split()
:
$post = split("<!--more-->", $context, 2);
$summary = $post[0];
$extended = $post[1];
但是注意到PHP手册里面有这样一句话:
Tip preg_split() 函数使用了 Perl 兼容正则表达式语法,通常是比 split() 更快的替代方案。如果不需要正则表达式的威力,则使用 explode() 更快,这样就不会招致正则表达式引擎的浪费。
也就是说,如果分隔符是常量的话,使用 explode() 可以更加高效。
$post = explode("<!--more-->", $context, 2);
$summary = $post[0];
$extended = $post[1];
实际上 split() 在 PHP 5.3.0 已经被弃用:
Warning This function has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged.
有意思的是这个 warning 只出现在英文文档里,而中文文档里只是一个 Tip.
¶Wordpress 实现
Wordpress 允许用户正定义 more 标记:<!--more[user tag]-->
,所以 Wordpress 不得不采用正则表达式。但它并没有使用 split()
或者 preg_split()
,而是先用 preg_match()
找到自定义 more 标记,再用 explode()
完成分割。
if ( preg_match('/<!--more(.*?)?-->/', $post, $matches) ) {
list($main, $extended) = explode($matches[0], $post, 2);
$more_text = $matches[1];
} else {
$main = $post;
$extended = '';
$more_text = '';
}
¶Typecho 实现
Typecho 只是简单使用字符串常量 <!--more-->
,所以直接使用了 explode()
。
$post = explode('<!--more-->', $text, 2);
return array(Typecho_Common::fixHtml($post[0]), isset($post[1]) ? Typecho_Common::fixHtml($post[1]) : NULL);