我正在尝试使用正则表达式将一大块中文文本拆分成句子。就我的目的而言,句子分隔符是:
- 全宽句号(0x3002)
- 全宽问号(0xFF1F)
- 全宽惊叹号(0xFF01)
现在,假设我的$str是这样的:$str = "你好。你好吗? 我是程序员,不太懂这个我问题,希望大家能够帮忙!一起加油吧!";
我使用带有以下参数的preg_split:
$str2 = preg_split("/(['x{3002}'x{FF01}'x{FF1F}])/u",$str,PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
$str2现在是一个如下所示的数组:
array(3) { [0]=> string(6) "你好" [1]=> string(9) "你好吗" [2]=> string(91) " 我是程序员,不太懂这个我问题,希望大家能够帮忙!一起加油吧!" }
然而,预期输出是:
[0] "你好。"
[1] "你好吗?"
[2] "我是程序员,不太懂这个我问题,希望大家能够帮忙!"
[3] "一起加油吧!"
正如你所看到的,有两个问题:这不能正确处理感叹号,第二,我的全角句号和全角问号消失了。我希望delim_capture能留住他们。我看这个代码太久了,不可能再弄清楚问题出在哪里了。我非常感谢你的建议。
您的正则表达式代码应该是这样的,以便能够捕获字符串+分隔符:
$str = "你好。你好吗? 我是程序员,不太懂这个我问题,希望大家能够帮忙!一起加油吧!";
$arr = preg_split("/'s*([^'x{3002}'x{FF01}'x{FF1F}]+['x{3002}'x{FF01}'x{FF1F}]'s*)/u",
$str, 0, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY );
var_dump($arr);
输出:
array(4) {
[0]=> string(9) "你好。"
[1]=> string(13) "你好吗? "
[2]=> string(72) "我是程序员,不太懂这个我问题,希望大家能够帮忙!"
[3]=> string(18) "一起加油吧!"
}
您缺少preg_split()
的$limit
参数。
数组preg_split(string$pattern,string$subject[,int$limit=-1[,int$flags=0]])
因此,您将传递PREG_SPLIT_DELIM_CAPTURE
(2)+PREG_SPLIT_NO_EMPTY
(1)=3
作为$limit
。这就是为什么它在三点停下来的原因。
添加null
作为$limit
参数,您的状态就很好。
preg_split($pattern, $str, null, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY)