一种(更简单)的方法是使用一次内置函数调用将 UTF-8 字符串中的所有字符提取到数组中
<?php
$str = 'Ма-
руся';
print_r(preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY));
?>
输出
数组
(
[0] => М
[1] => а
[2] => -
[3] =>
[4] => р
[5] => у
[6] => с
[7] => я
)
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
mb_split — 使用正则表达式分割多字节字符串
使用正则表达式 pattern
分割多字节 string
并将结果作为 array 返回。
注意:
默认情况下,mb_regex_encoding() 指定的字符编码将用作此函数的字符编码。
一种(更简单)的方法是使用一次内置函数调用将 UTF-8 字符串中的所有字符提取到数组中
<?php
$str = 'Ма-
руся';
print_r(preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY));
?>
输出
数组
(
[0] => М
[1] => а
[2] => -
[3] =>
[4] => р
[5] => у
[6] => с
[7] => я
)
$pattern 参数不像其他正则表达式函数(如 preg_match)那样使用 /pattern/ 定界符。
<?php
# 工作正常。模式周围没有斜杠
print_r( mb_split("\s", "hello world") );
Array (
[0] => hello
[1] => world
)
# 不起作用:
print_r( mb_split("/\s/", "hello world") );
Array (
[0] => hello world
)
?>
我想大多数人会想要一种简单的方法将多字节字符串分解成单个字符。这是我正在使用的函数来做到这一点。将 UTF-8 更改为您选择的编码方法。
<?php
function mbStringToArray ($string) {
$strlen = mb_strlen($string);
while ($strlen) {
$array[] = mb_substr($string,0,1,"UTF-8");
$string = mb_substr($string,1,$strlen,"UTF-8");
$strlen = mb_strlen($string);
}
return $array;
}
?>
要分割像这样的字符串:“日、に、本、ほん、語、ご”,使用 “、” 定界符,我使用了
$v = mb_split('、',"日、に、本、ほん、語、ご");
但它不起作用。
解决方法是在之前设置
mb_regex_encoding('UTF-8');
mb_internal_encoding("UTF-8");
$v = mb_split('、',"日、に、本、ほん、語、ご");
现在它可以工作了
数组
(
[0] => 日
[1] => に
[2] => 本
[3] => ほん
[4] => 語
[5] => ご
)
除了 Sezer Yalcin 的提示。
此函数将多字节字符串拆分为字符数组。类似于 str_split()。
<?php
function mb_str_split( $string ) {
# 在不是开头之后的所有位置拆分:^
# 而不是结尾之前:$
return preg_split('/(?<!^)(?!$)/u', $string );
}
$string = '火车票';
$charlist = mb_str_split( $string );
print_r( $charlist );
?>
# 打印
数组
(
[0] => 火
[1] => 车
[2] => 票
)
我同意有些人可能想要一个 mb_explode('', $string);
这是我的解决方案
<?php
$string = 'Hallöle';
$array = array_map(function ($i) use ($string) {
return mb_substr($string, $i, 1);
}, range(0, mb_strlen($string) -1));
expect($array)->toEqual(['H', 'a', 'l', 'l', 'ö', 'l', 'e']);
?>
我们这里讨论的是多字节(例如 UTF-8)字符串,因此 preg_split 对于以下字符串将失败
'Weiße Rosen sind nicht grün!'
而且因为我没有找到模拟 str_split 的正则表达式,所以我对 adjwilli 的第一个解决方案进行了一些优化
<?php
$string = '白色的玫瑰不是绿色的!'
$stop = mb_strlen( $string);
$result = array();
for( $idx = 0; $idx < $stop; $idx++)
{
$result[] = mb_substr( $string, $idx, 1);
}
?>
以下是使用 adjwilli 函数的示例
<?php
mb_internal_encoding( 'UTF-8');
mb_regex_encoding( 'UTF-8');
function mbStringToArray
( $string
)
{
$stop = mb_strlen( $string);
$result = array();
for( $idx = 0; $idx < $stop; $idx++)
{
$result[] = mb_substr( $string, $idx, 1);
}
return $result;
}
echo '<pre>', PHP_EOL,
print_r( mbStringToArray( '白色的玫瑰不是绿色的!', true)), PHP_EOL,
'</pre>';
?>
如果有人找到一个正则表达式来模拟使用 mb_split 的 str_split,请告诉我[通过个人电子邮件]。
另一种方法来分割多字节字符串
<?php
$s='әӘөүҗңһ';
//$temp_s=iconv('UTF-8','UTF-16',$s);
$temp_s=mb_convert_encoding($s,'UTF-16','UTF-8');
$temp_a=str_split($temp_s,4);
$temp_a_len=count($temp_a);
for($i=0;$i<$temp_a_len;$i++){
//$temp_a[$i]=iconv('UTF-16','UTF-8',$temp_a[$i]);
$temp_a[$i]=mb_convert_encoding($temp_a[$i],'UTF-8','UTF-16');
}
echo('<pre>');
print_r($temp_a);
echo('</pre>');
//也可以直接使用 UTF-16:
define('SLS',mb_convert_encoding('/','UTF-16'));
$temp_s=mb_convert_encoding($s,'UTF-16','UTF-8');
$temp_a=str_split($temp_s,4);
$temp_s=implode(SLS,$temp_a);
$temp_s=mb_convert_encoding($temp_s,'UTF-8','UTF-16');
echo($temp_s);
?>