wordpress和ci4实现“前两句”摘要需按标点识别语义单元,用strpos定位第二个句号最轻量;中文需预处理多标点并还原;ci4建议封装为excerptservice服务,wordpress应新建模板函数避免过滤器冲突。

WordPress 的摘要(excerpt)默认按字数截取,不识别句子边界,容易在句中截断;CodeIgniter 4(CI4)本身不提供语义化摘要函数,需自行封装。要实现“前两句”这类规范截取,关键不是长度控制,而是按标点识别完整语义单元。
用 strpos() 精准定位第二个句号
这是最轻量、最可控的方式,适合英文或中文混排但句号明确的场景:
- 先查第一个句号位置,再从该位置后继续找第二个句号
- 若只有一句,直接返回原字符串(已 rtrim 去右空格)
- 若无句号,补一个句号保证格式统一
- 截取时包含第二个句号本身,确保句子闭合
示例函数:
function excerpt_two_sentences(string $text): string {$first = strpos($text, '.');
if ($first === false) {
return rtrim($text) . '.';
}
$second = strpos($text, '.', $first + 1);
if ($second === false) {
return rtrim($text);
}
return rtrim(substr($text, 0, $second + 1));
}
兼容中文句号与省略号的多标点处理
中文内容常用「。」「!」「?」作句末标点,且可能含全角省略号(……)或半角三个点(...)。建议统一预处理:
- 用 str_replace 将中文句号、感叹号、问号、全角省略号替换为英文句号,便于后续统一查找
- 注意避免误替换单个点(如小数点、URL 中的点),可加正则限定:只替换后面紧跟空格、换行或字符串结尾的标点
- 截取后,再把临时句号还原为原文标点(可选,多数前端展示无需还原)
CI4 中集成为助手函数或服务类方法
推荐在 CI4 中建一个 TextHelper 或 ExcerptService,避免全局污染:
- 放在
app/Services/ExcerptService.php,构造时注入字符编码(如 'UTF-8') - 方法签名支持可选参数:
limitBySentences(int $count = 2, string $endPunct = '。!?') - 内部调用 mb_substr 安全截断备用路径——当无有效句末标点时,回退到按字符数截取并加省略号
- 在控制器或视图中调用:
$excerpt = service('excerpt')->twoSentences($content);
WordPress 场景下避免 filter 冲突
WP 的 the_excerpt() 默认经过多个过滤器(如 wp_trim_excerpt),可能覆盖你的逻辑。安全做法是:
- 不直接改写 the_excerpt,而新建模板函数,如
the_custom_excerpt() - 在函数内先移除 WP 默认过滤:
remove_all_filters('get_the_excerpt') - 传入原始 post_content,用上述句子截取逻辑处理,再手动 apply wp_kses_post 等安全过滤
- 对多字节内容强制使用 mb_strlen / mb_substr,防止中文乱码或截断异常











