Как перебрать строку, содержащую кириллицу? - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь перебрать строку, содержащую кириллические символы, и выполнить конкатенацию, но мой код возвращает искаженный текст.

Вот код:

$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(), но это тоже не сработало.

1 Ответ

0 голосов
/ 25 августа 2018

Вы не можете просто использовать числа смещения для доступа к многобайтовым символам.

Вам нужно использовать mb_strlen() AND mb_substr() для выделения нужных подстрок.

* примечание: кэширование $len хорошая идея. mb_ функции стоят дорого; Лучше всего минимизировать количество вызовов их в сценарии.

Код: ( Демо )

$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>слово
...