PHP中如何按「字母.」格式特定分隔符拆分字符串为数组
PHP 按单字母句首标识拆分字符串实现方案
你原有代码存在两个核心问题:
- 误用
preg_match做整串匹配校验,该函数无法实现字符串分割、生成结果数组的需求 - 正则规则写为匹配数字+点的格式,和你需要的「单个英文字母+英文点」拆分规则完全不匹配
实现思路
- 定位分割边界:匹配所有符合「单个英文字母+英文点+后续空格」的句首标识位置,避免误判句子中间出现的普通点号
- 选用
preg_split正则分割函数,开启配置项保留分割标识、过滤空结果,直接生成干净的句子数组 - 兼容两种输入格式:不管是各句子连写无换行、还是句子间带换行的格式都能正常识别
可直接运行的代码
<?php // 待处理原始字符串,支持连写、带换行两种格式 $input = "a. Hello my name is xxx.b. Hello is my name yyy?c. Hello my name is rrr!d. Hello my name is aaa"; // 正则规则:正向预查匹配句首的[单字母+点+空格]位置,不消耗字符本身 // PREG_SPLIT_NO_EMPTY:自动过滤分割产生的空值 $sentences = preg_split('/(?=\b[a-z]\. )/', $input, -1, PREG_SPLIT_NO_EMPTY); // 输出结果验证 print_r($sentences);
运行结果
执行后输出的数组结构如下,兼容句子末尾为./?/!/,/;等任意标点的场景:
Array ( [0] => a. Hello my name is xxx. [1] => b. Hello is my name yyy? [2] => c. Hello my name is rrr! [3] => d. Hello my name is aaa )
适配调整说明
- 如果句首标识可能出现大写字母(如
A./B.),把正则中的[a-z]替换为[a-zA-Z]即可 - 如果存在极端连写场景(点号后无空格,如
xxx.b.Hello),可将正则调整为/(?=\b[a-z]\.\s?)/兼容 - 不要用枚举字母的
explode方式拆分,该方式需要提前写全所有a-z的分隔标识,扩展性极差
内容的提问来源于stack exchange,提问作者Benny
相关产品推荐
相关产品推荐

