如何用“。”(中文期)作为分隔符来爆开/mb_split/preg_split ?

时间:2020-12-31 22:07:41

Here is an example string in Chinese:

下面是一个中文示例字符串:

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

How can I split this into an array that looks like this?:

如何将它分割成这样的数组?

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

I have tried and failed with:

我尝试过,但失败了:

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

I get this:

我得到了这个:

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

p.s. The charset is GB18030.

这个字符集是GB18030。

I found more info. The Chinese period is called a full stop. The html escapes are &#12290; and &#x3002;. The GB18030 hex bytes are a1a3. The Unicode Character is 'IDEOGRAPHIC FULL STOP' (U+3002). How can I use either of these to accomplish my goal?

我发现更多的信息。中国的这段时期被称为“句号”。html转义是。和& # x3002;。GB18030十六进制字节为a1a3。Unicode字符是“IDEOGRAPHIC FULL STOP”(U+3002)。我该如何利用这些来实现我的目标呢?

4 个解决方案

#1


0  

How about you just try

你试试怎么样?

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

$array =爆炸(' . ',$string);

This worked for me using commandline.

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

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

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

#2


0  

Try this:

试试这个:

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

Update:

To fix the characters of explode:

修正爆炸的特征:

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

#3


0  

My reason for needing to do this in gb18030 is that the library I was using (dedesplit) wouldn't work when converted to utf-8. The library is a Chinese word segmenter. I contacted the developer and he informed me of a new one that does work in utf-8 (http://www.itgrass.com/phpanalysis/index.html). I have tested it and it properly explodes the paragraphs with the Chinese period (or 'full stop') as the delimiter.

我在gb18030中需要这样做的原因是,我使用的库在转换为utf-8时不起作用。图书馆是一个中文的字节段。我联系了开发人员,他告诉我一个在utf-8 (http://www.itgrass.com/phpanalysis/index.html)工作的新软件。我已经对它进行了测试,它正确地利用了中国句号(或“full stop”)作为分隔符。

p.s. Before finding this new library, I had decided to write my own explode function. I think that may have worked, but I did zero testing.

在找到这个新图书馆之前,我决定写我自己的爆炸函数。我想这可能行得通,但我做了零测试。

#4


0  

The best thing is preg_split() with the /u (UTF8) option, example:

最好的方法是使用/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)

Results in

结果

  • v1 = array(12) { [0]=> string(3) "日" [1]=> string(3) "、" [2]=> string(3) "に" [3]=> string(3) "、" ... [11]=> string(3) "ご" }

    v1 = array(12){[0]=>字符串(3)“日”[1]= >字符串(3)","[2]=>字符串(3)“に”[3]= >字符串(3)”,“……[11]= >字符串(3)“ご”}

  • v2 = array(6) { [0]=> string(3) "日" [1]=> string(3) "に" [2]=> string(3) "本" [3]=> string(6) "ほん" [4]=> string(3) "語" [5]=> string(3) "ご" }

    v2 =数组(6){[0]=>字符串(3)“日”[1]= >字符串(3)“に”[2]= >字符串(3)“本”[3]= >字符串(6)“ほん”[4]= >字符串(3)“語”[5]= >字符串(3)“ご”}


Using with your example,

使用与你的例子,

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

Results

结果

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

So, not perfect... But as a regular expresion, you can adapt it to your needs:

所以,不完美……但是作为一种常规的解释,你可以根据你的需要来调整它:

Exact solution

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

now, with a negative look ahead, that is exctly what you need (!).

现在,带着消极的展望,这是你所需要的(!)

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

#1


0  

How about you just try

你试试怎么样?

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

$array =爆炸(' . ',$string);

This worked for me using commandline.

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

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

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

#2


0  

Try this:

试试这个:

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

Update:

To fix the characters of explode:

修正爆炸的特征:

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

#3


0  

My reason for needing to do this in gb18030 is that the library I was using (dedesplit) wouldn't work when converted to utf-8. The library is a Chinese word segmenter. I contacted the developer and he informed me of a new one that does work in utf-8 (http://www.itgrass.com/phpanalysis/index.html). I have tested it and it properly explodes the paragraphs with the Chinese period (or 'full stop') as the delimiter.

我在gb18030中需要这样做的原因是,我使用的库在转换为utf-8时不起作用。图书馆是一个中文的字节段。我联系了开发人员,他告诉我一个在utf-8 (http://www.itgrass.com/phpanalysis/index.html)工作的新软件。我已经对它进行了测试,它正确地利用了中国句号(或“full stop”)作为分隔符。

p.s. Before finding this new library, I had decided to write my own explode function. I think that may have worked, but I did zero testing.

在找到这个新图书馆之前,我决定写我自己的爆炸函数。我想这可能行得通,但我做了零测试。

#4


0  

The best thing is preg_split() with the /u (UTF8) option, example:

最好的方法是使用/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)

Results in

结果

  • v1 = array(12) { [0]=> string(3) "日" [1]=> string(3) "、" [2]=> string(3) "に" [3]=> string(3) "、" ... [11]=> string(3) "ご" }

    v1 = array(12){[0]=>字符串(3)“日”[1]= >字符串(3)","[2]=>字符串(3)“に”[3]= >字符串(3)”,“……[11]= >字符串(3)“ご”}

  • v2 = array(6) { [0]=> string(3) "日" [1]=> string(3) "に" [2]=> string(3) "本" [3]=> string(6) "ほん" [4]=> string(3) "語" [5]=> string(3) "ご" }

    v2 =数组(6){[0]=>字符串(3)“日”[1]= >字符串(3)“に”[2]= >字符串(3)“本”[3]= >字符串(6)“ほん”[4]= >字符串(3)“語”[5]= >字符串(3)“ご”}


Using with your example,

使用与你的例子,

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

Results

结果

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

So, not perfect... But as a regular expresion, you can adapt it to your needs:

所以,不完美……但是作为一种常规的解释,你可以根据你的需要来调整它:

Exact solution

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

now, with a negative look ahead, that is exctly what you need (!).

现在,带着消极的展望,这是你所需要的(!)

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