在PHP中创建随机UTF-8字符串的最佳功能? (仅字母字符) [英] Optimal function to create a random UTF-8 string in PHP? (letter characters only)

查看:90
本文介绍了在PHP中创建随机UTF-8字符串的最佳功能? (仅字母字符)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写了这个函数,它创建了一个UTF-8字符随机字符串.它运作良好,但正则表达式[^\p{L}]似乎并未过滤所有非字母字符.我想不出一种更好的方法来生成不带非字母字符的完整unicode范围.缺少手动搜索并定义65到65533之间的十进制字母的范围.

I wrote this function that creates a random string of UTF-8 characters. It works well, but the regular expression [^\p{L}] is not filtering all non-letter characters it seems. I can't think of a better way to generate the full range of unicode without non-letter characters.. short of manually searching for and defining the decimal letter ranges between 65 and 65533.

function rand_str($max_length, $min_length = 1, $utf8 = true) {
    static $utf8_chars = array();

    if ($utf8 && !$utf8_chars) {
        for ($i = 1; $i <= 65533; $i++) {
            $utf8_chars[] = mb_convert_encoding("&#$i;", 'UTF-8', 'HTML-ENTITIES');
        }

        $utf8_chars = preg_replace('/[^\p{L}]/u', '', $utf8_chars);

        foreach ($utf8_chars as $i => $char) {
            if (trim($utf8_chars[$i])) {
                $chars[] = $char;
            }
        }

        $utf8_chars = $chars;
    }

    $chars = $utf8 ? $utf8_chars : str_split('abcdefghijklmnopqrstuvwxyz');
    $num_chars = count($chars);
    $string = '';

    $length = mt_rand($min_length, $max_length);

    for ($i = 0; $i < $length; $i++) {
        $string .= $chars[mt_rand(1, $num_chars) - 1];
    }

    return $string;
}

推荐答案

\p{L}可能捕获了太多内容.尝试限制为{Ll}和{LU}-{L}包括{Lo}-其他.

\p{L} might be catching too much. Try to limit to {Ll} and {LU} -- {L} includes {Lo} -- others.

这篇关于在PHP中创建随机UTF-8字符串的最佳功能? (仅字母字符)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆