本文介绍一种可靠方法,使用 PHP 将长文本按最后一个完整句号(.)为界,精确切分为前后两段,确保第一部分以句号结尾,第二部分为剩余内容。
本文介绍一种可靠方法,使用
php
将长文本按最后一个完整句号(`.`)为界,精确切分为前后两段,确保第一部分以句号结尾,第二部分为剩余内容。
在实际开发中(如内容摘要生成、分页预处理或邮件正文截断),常需将一段长文本“智能”拆分为两部分,且要求
第一部分必须以句号(.)结尾
,避免截断在单词中间或标点前,保证语义完整性。仅用 explode('.', $text) 简单分割并不可靠——它会把所有句号都当作分隔符,产生大量碎片,且无法识别句号是否为句子结束(例如缩写 e.g.、Dr. 中的点),更难以精准定位“最后一个完整句子的结尾”。
✅ 推荐方案:使用 strrpos() 定位最后一个句号位置,再结合 substr() 切分:
?
关键说明与注意事项:
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
strrpos() 是高效且安全的选择,时间复杂度 O(n),无需正则开销;
严格检查句号后的字符(如空格、换行)可规避 e.g. 等误判,提升鲁棒性;
若业务场景对“句子”定义更严格(如需支持 ! ? 等终止标点),可扩展为多字符匹配,例如用 preg_match('/[.!?]\s+$/u', $text, $matches, PREG_OFFSET_CAPTURE) 定位最末句末标点;
始终校验 strrpos() 返回值是否为 false,防止空文本或无句号导致 substr() 错误;
中文混排文本中,句号 。 需单独处理(本例为英文,故未包含,但实际项目中应考虑 Unicode 标点兼容性)。
此方法简洁、可控、性能优良,适用于大多数服务端文本预处理场景。
立即学习
“
PHP免费学习笔记(深入)
”;
$text = 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry\'s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.';
// 查找最后一个句号的位置(注意:需确保其后紧跟空格或字符串结尾,提升语义准确性)
$lastDotPos = strrpos($text, '.');
if ($lastDotPos !== false) {
// 确保该句号是句子结束:后面是空格、换行或字符串末尾
$nextChar = $text[$lastDotPos + 1] ?? '';
if (ctype_space($nextChar) || $nextChar === '' || $nextChar === "\n" || $nextChar === "\r") {
$part1 = substr($text, 0, $lastDotPos + 1); // 包含句号
$part2 = substr($text, $lastDotPos + 2); // 跳过句号及后续空白
} else {
// 若最后一个句号不满足句子结束条件,可向前搜索更安全的句号(可选增强逻辑)
$part1 = rtrim(substr($text, 0, $lastDotPos), " \t\n\r") . '.';
$part2 = ltrim(substr($text, $lastDotPos + 1));
}
} else {
// 无句号时,按需处理:全归 part1 或抛出异常
$part1 = $text;
$part2 = '';
}
echo "Part 1:\n" . $part1 . "\n\nPart 2:\n" . $part2;