我怎么能用/。(中文句号)作为分隔符来爆炸/ mb_split / preg_split一个中文字符串?

时间:2012-11-14 21:00:45

标签: php

以下是中文的示例字符串:

"最初 , 上帝 创造 了 天地 。 2 大地 混沌 苍茫 , 深渊 的 表面 一 片 黑暗 。 "

如何将其拆分为一个看起来像这样的数组?:

Array
(
    [0] => 最初 , 上帝 创造 了 天地 。 2 大地 混沌 苍茫 , 深渊 的 表面 一 片 黑暗 。
    [1] => 2 大地 混沌 苍茫 , 深渊 的 表面 一 片 黑暗 。 
)

我尝试过但失败了:

$array = mb_split('。', $string);
echo "<pre>";
print_r($array);

我明白了:

Array
(
    [0] => 最初 , 上帝 创造 了 天地 。 2 大地 混沌 苍茫 , 深渊 的 表面 一 片 黑暗 。
)

P.S。字符集是GB18030。

我发现了更多信息。中国时期被称为句号。 html转义符为&#12290;&#x3002;。 GB18030十六进制字节为a1a3。 Unicode字符是'IDEOGRAPHIC FULL STOP'(U + 3002)。我怎样才能使用其中任何一个来实现我的目标?

4 个答案:

答案 0 :(得分:0)

试试这个:

$array = explode(chr(227), $string);

<强>更新

修复explode

的字符
foreach($array as $part) {
    echo str_replace(array(chr(128).chr(130)), '', $part);
    echo '<br>';
}

答案 1 :(得分:0)

你怎么试试

$ array = explode('。',$ string);

这对我使用命令行很有用。

输出: 排列 (     [0] =&gt;最初,上帝创造了天地     [1] =&gt; 2大地混沌苍茫,深渊的表面一片黑暗     [2] =&gt;

答案 2 :(得分:0)

我需要在gb18030中执行此操作的原因是我使用的库(dedesplit)在转换为utf-8时不起作用。该库是一个中文单词分段器。我联系了开发人员,他告诉我一个新的工作在utf-8(http://www.itgrass.com/phpanalysis/index.html)。我已对它进行了测试,并以中文句号(或“句号”)作为分隔符正确地展开段落。

P.S。在找到这个新库之前,我决定编写自己的爆炸函数。我认为这可能有用,但我做了零测试。

答案 3 :(得分:0)

最好的是preg_split()/u(UTF8)选项,例如:

 $s = "日、に、本、ほん、語、ご";
 $v1 = preg_split('/(?<!^)(?!$)/u', $s); // for multibyte str_split($list)
 // same as $v1=preg_split('//u', $s);array_pop($v1);array_shift($v1);
 $v2 = preg_split('/、/u', $s); // for multibyte explode("、",$list)

结果

  • v1 = array(12){[0] =&gt; string(3)“日”[1] =&gt; string(3)“,”[2] =&gt; string(3)“に”[3] =&gt; string(3)“,”... [11] =&gt; string(3)“ご”}

  • v2 = array(6){[0] =&gt; string(3)“日”[1] =&gt; string(3)“に”[2] =&gt; string(3)“本”[3] =&gt; string(6)“ほん”[4] =&gt; string(3)“语”[5] =&gt; string(3)“ご”}


使用您的示例,

$s = "最初 , 上帝 创造 了 天地 。 2 大地 混沌 苍茫 , 深渊 的 表面 一 片 黑暗 。 ";
$array  = preg_split('/。/u',$s);
var_dump($array);

结果

array(3) { [0]=> string(36) "最初 , 上帝 创造 了 天地 " 
           [1]=> string(61) " 2 大地 混沌 苍茫 , 深渊 的 表面 一 片 黑暗 " 
           [2]=> string(1) " " 
} 

所以,不完美......但作为一个正常的表达,你可以根据自己的需要进行调整:

精确解决方案

$array  = preg_split('/。(?!\s*$)/u',$string);

现在,使用negative look ahead,这正是您所需要的(!)。

array(3) { [0]=> string(36) "最初 , 上帝 创造 了 天地 " 
           [1]=> string(61) " 2 大地 混沌 苍茫 , 深渊 的 表面 一 片 黑暗 。 " 
}