Randoms.php 3.6 KB
Newer Older
李光春's avatar
李光春 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
<?php

// +----------------------------------------------------------------------
// | ThinkLibrary 6.0 for ThinkPhP 6.0
// +----------------------------------------------------------------------
// | 版权所有 2017~2020 [ https://www.dtapp.net ]
// +----------------------------------------------------------------------
// | 官方网站: https://gitee.com/liguangchun/ThinkLibrary
// +----------------------------------------------------------------------
// | 开源协议 ( https://mit-license.org )
// +----------------------------------------------------------------------
// | gitee 仓库地址 :https://gitee.com/liguangchun/ThinkLibrary
// | github 仓库地址 :https://github.com/GC0202/ThinkLibrary
李光春's avatar
李光春 已提交
14 15 16
// | gitlab 仓库地址 :https://gitlab.com/liguangchun/thinklibrary
// | weixin 仓库地址 :https://git.weixin.qq.com/liguangchun/ThinkLibrary
// | huaweicloud 仓库地址 :https://codehub-cn-south-1.devcloud.huaweicloud.com/composer00001/ThinkLibrary.git
李光春's avatar
李光春 已提交
17 18
// | Packagist 地址 :https://packagist.org/packages/liguangchun/think-library
// +----------------------------------------------------------------------
李光春's avatar
李光春 已提交
19

李光春's avatar
李光春 已提交
20
declare (strict_types=1);
李光春's avatar
李光春 已提交
21

李光春's avatar
李光春 已提交
22
namespace DtApp\ThinkLibrary\helper;
李光春's avatar
李光春 已提交
23

李光春's avatar
李光春 已提交
24 25
use Exception;

李光春's avatar
李光春 已提交
26 27
/**
 * 随机管理类
李光春's avatar
李光春 已提交
28
 * @mixin Randoms
李光春's avatar
李光春 已提交
29
 * @package DtApp\ThinkLibrary\helper
李光春's avatar
李光春 已提交
30
 */
李光春's avatar
李光春 已提交
31
class Randoms
李光春's avatar
李光春 已提交
32 33 34 35 36
{
    /**
     * 生成随机
     * @param int $length 长度
     * @param int $type 类型,1 纯数字,2 纯小写字母,3 纯大写字母,4 数字和小写字母,5 数字和大写字母,6 大小写字母,7 数字和大小写字母
李光春's avatar
李光春 已提交
37
     * @return string
李光春's avatar
李光春 已提交
38
     * @throws Exception
李光春's avatar
李光春 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
     */
    public function generate(int $length = 6, int $type = 1)
    {
        // 取字符集数组
        $number = range(0, 9);
        $lowerLetter = range('a', 'z');
        $upperLetter = range('A', 'Z');
        // 根据type合并字符集
        if ($type == 1) {
            $charset = $number;
        } elseif ($type == 2) {
            $charset = $lowerLetter;
        } elseif ($type == 3) {
            $charset = $upperLetter;
        } elseif ($type == 4) {
            $charset = array_merge($number, $lowerLetter);
        } elseif ($type == 5) {
            $charset = array_merge($number, $upperLetter);
        } elseif ($type == 6) {
            $charset = array_merge($lowerLetter, $upperLetter);
        } elseif ($type == 7) {
            $charset = array_merge($number, $lowerLetter, $upperLetter);
        } else {
            $charset = $number;
        }
        $str = '';
        // 生成字符串
        for ($i = 0; $i < $length; $i++) {
李光春's avatar
李光春 已提交
67
            $str .= $charset[random_int(0, count($charset) - 1)];
李光春's avatar
李光春 已提交
68 69 70 71
            // 验证规则
            if ($type == 4 && strlen($str) >= 2) {
                if (!preg_match('/\d+/', $str) || !preg_match('/[a-z]+/', $str)) {
                    $str = substr($str, 0, -1);
李光春's avatar
李光春 已提交
72
                    --$i;
李光春's avatar
李光春 已提交
73 74 75 76 77
                }
            }
            if ($type == 5 && strlen($str) >= 2) {
                if (!preg_match('/\d+/', $str) || !preg_match('/[A-Z]+/', $str)) {
                    $str = substr($str, 0, -1);
李光春's avatar
李光春 已提交
78
                    --$i;
李光春's avatar
李光春 已提交
79 80 81 82 83
                }
            }
            if ($type == 6 && strlen($str) >= 2) {
                if (!preg_match('/[a-z]+/', $str) || !preg_match('/[A-Z]+/', $str)) {
                    $str = substr($str, 0, -1);
李光春's avatar
李光春 已提交
84
                    --$i;
李光春's avatar
李光春 已提交
85 86 87 88 89
                }
            }
            if ($type == 7 && strlen($str) >= 3) {
                if (!preg_match('/\d+/', $str) || !preg_match('/[a-z]+/', $str) || !preg_match('/[A-Z]+/', $str)) {
                    $str = substr($str, 0, -2);
李光春's avatar
李光春 已提交
90
                    $i -= 2;
李光春's avatar
李光春 已提交
91 92 93 94 95 96
                }
            }
        }
        return $str;
    }
}