
本文介绍在 php 中精准截取字符串前两个句子(以句号为分隔符)的两种可靠方法:基于 `explode()` 的数组分割法和基于 `strpos()` 的二次定位法,并附带边界处理、编码安全与实际应用注意事项。
在动态内容展示(如新闻摘要、产品简介或 CMS 摘要生成)中,常需将一段未知长度的文本截断为“前两句话”,而非固定字符数——因为按字数截可能切断句子,影响可读性;而按句号(.)截取第二句末尾,则更符合语义逻辑。
以下是两种生产环境推荐的实现方式:
✅ 方法一:使用 strpos() 精确查找第二个句号(推荐)
该方法高效、内存友好,且避免因句号出现在缩写(如 e.g.、Dr.)、URL 或小数点中导致误判(后续会说明规避策略):
function truncateToTwoSentences(string $text): string {
// 查找第一个句号位置
$firstDot = strpos($text, '.');
if ($firstDot === false) {
return rtrim($text) . '.'; // 无句号则补一个
}
// 从第一个句号后继续查找第二个句号
$secondDot = strpos($text, '.', $firstDot + 1);
if ($secondDot === false) {
return rtrim($text); // 只有一句,返回原句(已去右空格)
}
// 截取至第二个句号(含)
return rtrim(substr($text, 0, $secondDot + 1));
}
// 示例使用
$aychFour = "From the start, community-minded business. Throughout our
25-year history in ABC, we have continually ways to give back.
We with local charities, involvement in numerous activities &
seasonal, as well as hosting in-store events so our guests can also.";
echo truncateToTwoSentences($aychFour);
// 输出:From the start, community-minded business. Throughout our
// 25-year history in ABC, we have continually ways to give back.⚠️ 注意:此方法默认将 . 视为句子结束符。若原文含常见英文缩写(如 U.S.A.、Mr.),建议先做预处理(如用正则替换 (?
✅ 方法二:使用 explode() 分割再拼接(简洁易懂)
适合对性能要求不高、且能确保句号不被滥用的场景:
立即学习“PHP免费学习笔记(深入)”;
function truncateByExplode(string $text): string {
$parts = explode('.', $text);
// 至少保留前两段(即使为空),并确保每段末尾加句号
$sentences = array_slice($parts, 0, 2);
return implode('.', array_map('trim', $sentences)) . (count($sentences) > 0 ? '.' : '');
}⚠️ 缺陷提示:explode() 会把所有 .(包括 123.45、https://example.com 中的点)都当作分隔符,可能导致错误截断。因此仅推荐用于受控文本(如人工编辑的简介),不建议用于用户自由输入或富文本提取内容。
? 补充建议:增强鲁棒性的进阶思路
-
多标点支持:中文常以 。、英文常用 ! 和 ? 结束句子。可扩展正则匹配:
$pattern = '/[.!?。!?]+(?=\s+[A-Z\u4e00-\u9fa5]|\s*$)/u'; preg_match_all($pattern, $text, $matches, PREG_OFFSET_CAPTURE);
取前两次匹配的结束位置进行截断。
-
UTF-8 安全:始终使用 mb_* 函数处理多字节字符串(如 mb_substr()、mb_strpos()),尤其当内容含中文、日文等时:
$firstDot = mb_strpos($text, '。', 0, 'UTF-8');
空格与换行清理:截取后建议调用 trim() 或 preg_replace('/\s+/', ' ', ...) 统一空白符,提升前端渲染一致性。
总之,对于绝大多数 PHP Web 项目中的摘要生成需求,优先采用双 strpos() 方案——它轻量、可控、易于测试,且便于后续扩展为智能断句逻辑。记住:真正的“句子”识别需 NLP 支持,但“前两个句号截断”已是兼顾准确性与工程效率的最佳实践。











