Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php unicode模式下的preg_分割:delim_捕获不工作?_Php_Regex_Unicode - Fatal编程技术网

Php unicode模式下的preg_分割:delim_捕获不工作?

Php unicode模式下的preg_分割:delim_捕获不工作?,php,regex,unicode,Php,Regex,Unicode,我试着用正则表达式把一大块中文文本分成句子。就我而言,句子分隔符是: 全宽全止点。(0x3002) 全宽问号?(0xFF1F) 全宽感叹号!(0xFF01) 现在,假设我的$str是: $str=”你好。你好吗? 我是程序员,不太懂这个我问题,希望大家能够帮忙!一起加油吧!"; 我使用带有以下参数的preg_split: $str2 = preg_split("/([\x{3002}\x{FF01}\x{FF1F}])/u",$str,PREG_SPLIT_DELIM_CAPTURE|PRE

我试着用正则表达式把一大块中文文本分成句子。就我而言,句子分隔符是:

  • 全宽全止点。(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保留它们。我已经看了这么久的代码,不可能再找出问题所在。我非常感谢您的建议。

您缺少到的
$limit
参数

数组预分割(字符串$pattern,字符串$subject[,int$limit=-1[,int$flags=0]]

因此,您通过了
PREG\u SPLIT\u DELIM\u CAPTURE
(2)+
PREG\u SPLIT\u NO\u EMPTY
(1)=
3
作为
$limit
。这就是它在三点停止的原因

添加
null
作为
$limit
参数,您的状态良好

preg_split($pattern, $str, null, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY)

您的正则表达式代码应如下所示,以便能够捕获字符串+分隔符:

$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) "一起加油吧!"
}

啊,当然……这仍然将分隔符放在一个单独的字符串中,但是如果我使用@anubhava提供的正则表达式,也解决了。非常感谢!绝对完美!非常感谢!