unicode模式下的preg_split:delim_capture不工作


preg_split in unicode mode: delim_capture not working?

我正在尝试使用正则表达式将一大块中文文本拆分成句子。就我的目的而言,句子分隔符是:

  • 全宽句号(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)