下面是一个中文字符串示例:
"最初 , 上帝 创造 了 天地 。 2 大地 混沌 苍茫 , 深渊 的 表面 一 片 黑暗 。 "
如何将其拆分为如下所示的数组?
Array
(
[0] => 最初 , 上帝 创造 了 天地 。 2 大地 混沌 苍茫 , 深渊 的 表面 一 片 黑暗 。
[1] => 2 大地 混沌 苍茫 , 深渊 的 表面 一 片 黑暗 。
)
我尝试过并失败了:
$array = mb_split('。', $string);
echo "<pre>";
print_r($array);
我明白这个:
Array
(
[0] => 最初 , 上帝 创造 了 天地 。 2 大地 混沌 苍茫 , 深渊 的 表面 一 片 黑暗 。
)
附言字符集GB18030。
我找到了更多信息。中国时期被称为句号。html 转义是。
和。
的。十六进制字节GB18030是 a1a3。Unicode 字符是"表意句号"(U+3002)。我如何使用其中任何一个来实现我的目标?
你试试怎么样
$array = 爆炸('。', $string);
这使用命令行对我有用。
输出:数组( [0] => 最初 , 上帝 创造 了 天地 [1] => 2 大地 混沌 苍茫 , 深渊 的 表面 一 片 黑暗 [2] =>
)
试试这个:
$array = explode(chr(227), $string);
更新:
要修复explode
的字符:
foreach($array as $part) {
echo str_replace(array(chr(128).chr(130)), '', $part);
echo '<br>';
}
我需要在 gb18030 中执行此操作的原因是,我使用的库(dedesplit)在转换为 utf-8 时不起作用。该库是一个中文分词器。我联系了开发人员,他告诉我一个新的可以在utf-8(http://www.itgrass.com/phpanalysis/index.html)中工作。我已经测试了它,它正确地分解了以中国句号(或"句号")作为分隔符的段落。
附言在找到这个新库之前,我决定编写自己的分解函数。我认为这可能奏效了,但我做了零测试。
最好的办法是使用/u
(UTF8)选项preg_split()
,例如:
$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]=> string(3) "日" [1]=> string(3) "、" [2]=> string(3)
"に" [3]=> string(3) "、" ...[11]=> 字符串(3) "ご" }
v2 = array(6) { [0]=> 字符串(3) "日" [1]=> 字符串(3) "に" [2]=> 字符串(3) "本" [3]=> 字符串(6) "ほん" [4]=> 字符串(3) "語" [5]=> 字符串(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);
现在,展望未来,这完全是你所需要的(!
array(3) { [0]=> string(36) "最初 , 上帝 创造 了 天地 "
[1]=> string(61) " 2 大地 混沌 苍茫 , 深渊 的 表面 一 片 黑暗 。 "
}