在PHP中将字符串拆分为Unicode字符数组的最佳方法是什么?

joe*_*ker 14 php arrays unicode split

在PHP中,将字符串拆分为Unicode字符数组的最佳方法是什么?如果输入不一定是UTF-8?

我想知道输入字符串中的Unicode字符集是否是另一组Unicode字符的子集.

为什么不直接运行mb_函数系列,因为前几个答案没有?

Pas*_*TIN 17

您可以将'u'修饰符与PCRE正则表达式一起使用; 见模式修饰符(引用):

你(PCRE8)

此修饰符打开与Perl不兼容的PCRE的其他功能.模式字符串被视为UTF-8.此修饰符可从Unix上的PHP 4.1.0或更高版本以及win32上的PHP 4.2.3获得.自PHP 4.3.5起,检查模式的UTF-8有效性.

例如,考虑以下代码:

header('Content-type: text/html; charset=UTF-8');  // So the browser doesn't make our lives harder
$str = "abc ????, efg";

$results = array();
preg_match_all('/./', $str, $results);
var_dump($results[0]);
Run Code Online (Sandbox Code Playgroud)

你会得到一个无法使用的结果:

array
  0 => string 'a' (length=1)
  1 => string 'b' (length=1)
  2 => string 'c' (length=1)
  3 => string ' ' (length=1)
  4 => string '?' (length=1)
  5 => string '?' (length=1)
  6 => string '?' (length=1)
  7 => string '?' (length=1)
  8 => string '?' (length=1)
  9 => string '?' (length=1)
  10 => string '?' (length=1)
  11 => string '?' (length=1)
  12 => string '?' (length=1)
  13 => string '?' (length=1)
  14 => string '?' (length=1)
  15 => string '?' (length=1)
  16 => string ',' (length=1)
  17 => string ' ' (length=1)
  18 => string 'e' (length=1)
  19 => string 'f' (length=1)
  20 => string 'g' (length=1)
Run Code Online (Sandbox Code Playgroud)

但是,使用此代码:

header('Content-type: text/html; charset=UTF-8');  // So the browser doesn't make our lives harder
$str = "abc ????, efg";

$results = array();
preg_match_all('/./u', $str, $results);
var_dump($results[0]);
Run Code Online (Sandbox Code Playgroud)

(注意正则表达式末尾的'u')

你得到你想要的:

array
  0 => string 'a' (length=1)
  1 => string 'b' (length=1)
  2 => string 'c' (length=1)
  3 => string ' ' (length=1)
  4 => string '?' (length=3)
  5 => string '?' (length=3)
  6 => string '?' (length=3)
  7 => string '?' (length=3)
  8 => string ',' (length=1)
  9 => string ' ' (length=1)
  10 => string 'e' (length=1)
  11 => string 'f' (length=1)
  12 => string 'g' (length=1)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :-)


mpe*_*pen 9

preg_match_all以下更简单:

preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY)
Run Code Online (Sandbox Code Playgroud)

这样可以返回一维的字符数组.不需要匹配对象.


Rub*_*ley 8

值得一提的是,从 PHP 7.4 开始,有一个内置函数mb_str_split可以执行此操作。

$chars = mb_str_split($str);
Run Code Online (Sandbox Code Playgroud)

与此不同的是,preg_split('//u', $str)它支持 UTF-8 以外的编码。


Jas*_*oof 6

试试这个:

preg_match_all('/./u', $text, $array);
Run Code Online (Sandbox Code Playgroud)