3

假设在 2019 年,每个不是 UNICODE 安全的解决方案都是错误的。在 PHP 中将字符串转换为 UNICODE 字符数组的最佳方法是什么?

显然,这意味着使用大括号语法访问字节是错误的,以及使用str_split

$arr = str_split($text);

从样本输入,如:

$string = '先éé€‍ ‍❤️‍';

我预计:

array(16) {


[0]=>
  string(3) "先"
  [1]=>
  string(2) "é"
  [2]=>
  string(1) "e"
  [3]=>
  string(2) "́"
  [4]=>
  string(3) "€"
  [5]=>
  string(4) ""
  [6]=>
  string(4) ""
  [7]=>
  string(4) ""
  [8]=>
  string(3) "‍"
  [9]=>
  string(1) " "
  [10]=>
  string(4) ""
  [11]=>
  string(3) "‍"
  [12]=>
  string(3) "❤"
  [13]=>
  string(3) "️"
  [14]=>
  string(3) "‍"
  [15]=>
  string(4) ""
}
4

2 回答 2

3

只需传递一个带有PREG_SPLIT_NO_EMPTY标志的空模式。否则,您可以使用\X(unicode dot) 和\K(restart fullstring match) 编写模式。我将包括一个mb_split()电话和一个preg_match_all()完整的电话。

代码:(演示

$string='先秦兩漢';
var_export(preg_split('~~u', $string, 0, PREG_SPLIT_NO_EMPTY));
echo "\n---\n";
var_export(preg_split('~\X\K~u', $string, 0, PREG_SPLIT_NO_EMPTY));
echo "\n---\n";
var_export(preg_split('~\X\K(?!$)~u', $string));
echo "\n---\n";
var_export(mb_split('\X\K(?!$)', $string));
echo "\n---\n";
var_export(preg_match_all('~\X~u', $string, $out) ? $out[0] : []);

所有产品::

array (
  0 => '先',
  1 => '秦',
  2 => '兩',
  3 => '漢',
)

来自https://www.regular-expressions.info/unicode.html

如何匹配单个 Unicode 字形

在 Perl、PCRE、PHP、Boost、Ruby 2.0、Java 9 和 Just Great Software 应用程序中,匹配单个字素(无论是编码为单个代码点还是使用组合标记编码为多个代码点)都很容易:只需使用 \ X。

您可以考虑 \X 点的 Unicode 版本。但是有一个区别:\X 总是匹配换行符,而点不匹配换行符,除非您启用点匹配换行符匹配模式。


更新,DHarman 引起了我的注意,mb_str_split()现在可以从 PHP7.4 获得。

新函数的默认长度参数为 1,因此这种情况下可以省略长度参数。

https://wiki.php.net/rfc/mb_str_split

Dharman 的演示:https ://3v4l.org/M85Fi/rfc#output

于 2019-04-21T14:09:27.510 回答
1

这对我有用,它将一个 unicode 字符串分解为一个字符数组:

//
// split at all position not after the start: ^
// and not before the end: $, with unicode modifier
// u (PCRE_UTF8).
//
$arr = preg_split("/(?<!^)(?!$)/u", $text);

例如:

<?php
//
$text = "堆栈溢出";

$arr = preg_split("/(?<!^)(?!$)/u", $text);

echo '<html lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
';

print_r($arr);

echo '</body>
</html>
';
?>

在浏览器中,它会生成:

Array ( [0] => 堆 [1] => 栈 [2] => 溢 [3] => 出 )
于 2019-04-21T13:15:13.723 回答