PHP移除段落首句的函数实现 拆分XML产品描述为标题与详情
移除段落首句(兼容.?!三类句末标识)的PHP实现
实现核心逻辑
拆分剩余内容的规则和首句提取完全同源:定位到段落中第一个符合标准的句末标点位置,直接截取该位置之后的所有文本,清理冗余空白后即可得到商品详情部分。
匹配规则需要满足几个基础要求:
- 同时识别.、?、!三类句末终止符
- 尽量减少对缩写内标点的误判
- 兼容不同排版习惯下的句末格式
可直接复用的函数代码
function get_content_after_first_sentence(string $paragraph): string { // 清理原文首尾冗余空白 $paragraph = trim($paragraph); if (empty($paragraph)) { return ''; } // 匹配规则:非贪婪匹配到第一个句末标点,标点满足以下任一情况即判定为真正的句末 // 1. 后跟空白字符 2. 后跟大写字母(适配无空格排版场景) 3. 到达文本结尾 $pattern = '/^.*?[.?!](?=\s|[A-Z]|$)/u'; // 移除匹配到的首句部分 $remainingText = preg_replace($pattern, '', $paragraph); // 清理剩余内容开头的多余空白,返回最终结果 return trim($remainingText); }
效果验证
拿你提到的测试用例测试:
输入原文:
Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.函数输出:
Consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.
针对问号、感叹号作为句末的非句号场景,函数同样可以正常拆分:
- 输入"Have you checked our 2-year warranty? All products come with free shipping and 30-day return policy.",输出为
All products come with free shipping and 30-day return policy. - 输入"This wireless headphone delivers 40 hours of battery life! It supports fast charging and noise cancellation for daily commute.",输出为
It supports fast charging and noise cancellation for daily commute.
业务适配调整
- 正则中的
u修饰符必须保留,否则处理含特殊字符、多字节外文的产品描述时会出现截断乱码 - 匹配断言可根据实际排版灵活调整:
- 如果你的产品描述都是句末标点后跟标准空格的规范排版,可以把正则中的
[A-Z]断言去掉,仅保留(?=\s|$)规则,能彻底避免“Mr.”“U.S.A.”这类缩写中的标点被误判为句末 - 如果存在句末无空格的非规范排版,保留
[A-Z]断言可以保证拆分成功率,只是需要对缩写较多的内容提前做特殊兼容
- 如果你的产品描述都是句末标点后跟标准空格的规范排版,可以把正则中的
- 如果遇到无标点的纯文本场景(比如内容本身没有任何句末标识),函数会返回空字符串,你可以根据业务逻辑增加判断:如果拆分后的剩余内容为空,直接返回原段落作为详情即可,避免出现详情空白的问题
内容的提问来源于stack exchange,提问作者Stathis
相关产品推荐
相关产品推荐

