Randoms.php 3.4 KB
Newer Older
李光春's avatar
李光春 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
<?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
// | Packagist 地址 :https://packagist.org/packages/liguangchun/think-library
// +----------------------------------------------------------------------
李光春's avatar
李光春 已提交
16

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

李光春's avatar
李光春 已提交
19
namespace DtApp\ThinkLibrary\helper;
李光春's avatar
李光春 已提交
20

李光春's avatar
李光春 已提交
21 22
use Exception;

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