【问题标题】:How to iterate a string containing cyrillic characters?如何迭代包含西里尔字符的字符串?
【发布时间】:2018-08-25 06:23:19
【问题描述】:

我正在尝试迭代一个包含西里尔字符的字符串并执行连接,但我的代码返回了错乱的文本。

代码如下:

$str = "слово";
$temp = "";
for ($i = 0; $i < strlen($str); $i++) {
    $temp.=$str[$i];
    echo $temp . '<br>';
}
echo $temp;

输出:

�<br>с<br>с�<br>сл<br>сл�<br>сло<br>сло�<br>слов<br>слов�<br>слово<br>слово

期望的输出:

с<br>сл<br>сло<br>слов<br>слово<br>слово

我也尝试使用mb_strlen() 而不是strlen(),但这也不起作用。

【问题讨论】:

  • UTF-8 一直通过?这些是多字节字符。使用mb_ 函数。你不能简单地通过字符串[$i]

标签: php string substring cyrillic multibyte


【解决方案1】:

您不能简单地使用偏移数字来访问多字节字符。

您需要使用mb_strlen() AND mb_substr() 来隔离您想要的子字符串。

*注意:缓存$len 是个好主意。 mb_ 函数很昂贵;最好尽量减少在脚本中调用它们的次数。

代码:(Demo)

$str = "слово";
$temp = "";
for ($i = 0, $len = mb_strlen($str); $i < $len; $i++) {
    $temp .= mb_substr($str, $i, 1);
    echo $temp . '<br>';
}
echo $temp;

输出:

с<br>сл<br>сло<br>слов<br>слово<br>слово

根据您的实际项目需求,这里有一个不需要$temp 变量的替代方案:

$str = "слово";
for ($i = 0, $len = mb_strlen($str); $i < $len; $i++) {
    if ($i) echo '<br>';
    echo mb_substr($str, 0, $i + 1);
}
// с<br>сл<br>сло<br>слов<br>слово

【讨论】:

  • @JoeDoe 我添加了一个替代的 sn-p,以防你想取消 $temp 变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 2016-06-15
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多