PHP: как разбить строку UTF-8?

У меня есть следующий код, который не работает с символами UTF-8. Как я могу это исправить?

$seed = preg_split('//u', $seed, -1, PREG_SPLIT_NO_EMPTY);
$seed = str_split('АБВГДЕЖЗ'); // and any other characters

shuffle($seed); // probably optional since array_is randomized; this may be redundant
$code = '';
foreach (array_rand($seed, 5) as $k) $md5_hash .= $seed[$k];

//We don't need a 32 character long string so we trim it down to 5 
$security_code = $code;

Я пробовал этот код:

$seed = preg_split('//u', $seed, -1, PREG_SPLIT_NO_EMPTY);

но он все еще не работает.


person user3288430    schedule 08.02.2014    source источник
comment
Когда я ввожу PHP str_split UTF-8 в Google, я получаю очень хороший результат на позиции №1.   -  person Pekka    schedule 09.02.2014
comment
@Pekka웃 когда я делаю это сейчас, я получаю этот вопрос   -  person apokryfos    schedule 11.04.2017


Ответы (2)


Вы должны создать переменную $seed и присвоить ей строковое значение, прежде чем сможете использовать ее в качестве второго параметра preg_split:

$seed = 'АБВГДЕЖЗ';
$seed = preg_split('//u', $seed, -1, PREG_SPLIT_NO_EMPTY);

Вывод print_r($seed) будет:

Array
(
    [0] => А
    [1] => Б
    [2] => В
    [3] => Г
    [4] => Д
    [5] => Е
    [6] => Ж
    [7] => З
)

Я надеюсь, что остальная часть вашего кода будет работать нормально.

person Sharanya Dutta    schedule 09.02.2014
comment
Нет необходимости передавать строку в preg_split как переменную. Функция этого не требует. Это может быть строка. - person oleksii.svarychevskyi; 09.02.2014
comment
ты спас мой день! - person Pagorn; 26.09.2017

Для работы со строками UTF-8 используйте многобайтовые строковые функции.

Для вашей цели это будет mb_split.

Обновить

$seed = preg_split('//u', 'abcdefghijklmnopqrstuvwxyz', -1, PREG_SPLIT_NO_EMPTY);
foreach (array_rand($seed, 5) as $k) {
    $md5_hash .= $seed[$k];
}
person oleksii.svarychevskyi    schedule 08.02.2014
comment
Спасибо, но это не работает $seed = mb_split('АБВГДЕЖЗ'); // и любые другие символы - person user3288430; 09.02.2014
comment
У вас включен модуль php extension=php_mbstring.dll? - person oleksii.svarychevskyi; 09.02.2014
comment
да. Я не понимаю, как должен выглядеть код с этой функцией. - person user3288430; 09.02.2014
comment
Что-то вроде этого mb_split("\s", "hello world") - person oleksii.svarychevskyi; 09.02.2014
comment
В вашем случае это должно быть mb_split(//, АБВГДЕЖЗ) - person oleksii.svarychevskyi; 09.02.2014
comment
Теперь не работает (спасибо за помощь!): $seed = mb_split('//', 'abcdefghijklmnopqrstuvwxyz'); // and any other characters shuffle($seed); // probably optional since array_is randomized; this may be redundant $code = ''; foreach (array_rand($seed, 5) as $k) $md5_hash .= $seed[$k]; //We don't need a 32 character long string so we trim it down to 5 $security_code = $code; - person user3288430; 09.02.2014
comment
Так я и не попал. Я тебе помог или нет? - person oleksii.svarychevskyi; 09.02.2014
comment
Нет :( Это правильный код? У меня Warning: array_rand() [function.array-rand]: Second argument has to be between 1 and the number of elements in the array in C:\AppServ\www\php\total.php on line 7 Warning: Invalid argument supplied for foreach() in C:\AppServ\www\php\total.php on line 7 - person user3288430; 09.02.2014