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=”你好。你好吗? 我是程序员,不太懂这个我问题,希望大家能够帮忙!一起加油吧!";代码>
我使用带有以下参数的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提供的正则表达式,也解决了。非常感谢!绝对完美!非常感谢!