php隨機字符串生成類

字號+ 編輯: 国内TP粉 修訂: 人在硅谷 來源: ThinkPHP 2023-09-10 我要說兩句(0)

根據用戶指定的格式和槼則生成隨機字符串,支持多層嵌套,支持常量轉換。附件中包含使用實例和默認的槼則文档。

文档名RandEx.php

namespace RandEx;
include "Functions.php";
class RandEx {
    //構造函數,format爲生成隨機字符串的格式,rule爲用戶自定義的生成槼則,const爲用戶自定義的常量
    public function __construct($format = null, $rules = null, $const = "") {
        $this->format = is_null($format) ? "" : $format;
        if(is_null($rules))
            //如果不指定自定義槼則,則讀取目錄下的RulesDefault.ini作爲槼則
            $rules = file_get_contents(__DIR__."/RulesDefault.ini");
        $this->config($rules, $const);
    }
    //設置格式($type == 0)、槼則(1)、常量(2)
    public function set($str = null, $type) {
        switch($type) {
            case 0:
                $this->format = is_null($str) ? "" : $str;
                break;
            case 1:
                if(is_null($str))
                    $str = file_get_contents("RulesDefault.ini");
                $this->config($str);
                break;
            case 2:
                $this->config(null, $str);
                break;
        }
    }
    //根據已配置的槼則生成隨機字符串,number爲生成的數量(默認爲1)。若不爲1,返回二維數組。
    public function generate($number = 1) {
        if($number < 1)
            return $this->format;
        for($i = 0; $i < $number; $i++) {
            $str = $this->format;
            // 每次替換字符串後進行一次判斷,若字符串内容無更改,則結束循環
            do {
                $tempStr = $str;
                $str = $this->formatConvert($str);
                $str = $this->constConvert($str);
            } while($tempStr !== $str);
            if($number == 1)
                return $str;
            $ret[] = $str;
        }
        return $ret;
    }

    // 析構函數
    public function __destruct() {}
    // 解析槼則,以多維數組形式保存在私有成員變量中
    private function config($rules = null, $const = null) {
        //使用換行符分割
        if(!is_null($rules)) {
            unset($this->rules);
            $rulesArr = explode("\r\n", $rules);
            $arrCount = count($rulesArr);
            if($arrCount == 0)
                $this->rules = array(array(), array(array()));
            for($i = 0; $i < $arrCount; $i++) {
                $tempArr = explode("::", $rulesArr[$i], 2);
                if(count($tempArr) != 2)
                    continue;
                $this->rules[0][] = $tempArr[0];
                $this->rules[1][] = explode(",", $tempArr[1]);
            }
        }
        if(!is_null($const)) {
            unset($this->const);
            $constArr = explode("\r\n", $const);
            $arrCount = count($constArr);
            if($arrCount == 0)
                $this->const = array(array(), array());
            for($i = 0; $i < $arrCount; $i++) {
                $tempArr = explode("::", $constArr[$i], 2);
                if(count($tempArr) != 2)
                    continue;
                $this->const[0][] = $tempArr[0];
                $this->const[1][] = $tempArr[1];
            }
        }
    }

    // 使用指定槼則槼則進行字符串轉換
    private function formatConvert($str) {
        $c = count($this->rules[0]);
        $str = self::innerConvert($str);
        for($i = 0; $i < $c; $i++) {
            $find = "[*".$this->rules[0][$i].":";
            while(strpos($str, $find) !== false) {
                $replaceCount = count($this->rules[1][$i]);
                $rangeStr = strBetween($str, $find, "*]");
                $rangeArr = explode(",", $rangeStr, 2);
                if(count($rangeArr) != 2)
                    break;
                mt_srand();
                //生成的次數
                $loop = mt_rand($rangeArr[0], $rangeArr[1]);
                $tempStr = "";
                for($j = 0; $j < $loop; $j++)
                    $tempStr .= $this->rules[1][$i][mt_rand(0, $replaceCount - 1)];
                $str = str_replace_once($find.$rangeStr."*]", $tempStr, $str);
            }
        }
        return $str;
    }

    // 轉換常量
    private function constConvert($str) {
        //轉換爲逗號
        $str = str_replace("{*C*}", ",", $str);
        //轉換爲換行符,可根據情況改爲\n、\r、\r\n
        $str = str_replace("{*B*}", "<br>", $str);
        $c = count($this->const[0]);
        for($i = 0; $i < $c; $i++) {
            $find = "{*".$this->const[0][$i]."*}";
            $str = str_replace($find, $this->const[1][$i], $str);
        }
        return $str;
    }

    // 使用内置的槼則進行字符串轉換
    private static function innerConvert($str) {
        mt_srand();
        //隨機英文字母
        while(strpos($str, "[*A:") !== false) {
            $result = strBetween($str, "[*A:", "*]");
            $arr = explode(",", $result, 3);
            if(count($arr) < 2)
                break;
            if(count($arr) == 2)
                $arr[] = "0";
            $replace = randAlphabet(mt_rand((int)$arr[0], (int)$arr[1]), (int)$arr[2]);
            $str = str_replace_once("[*A:".$result."*]", $replace, $str);
        }
        //隨機漢字、數字、字母+數字
        for($i = 0; $i < 4; $i++) {
            $prefix = array("[*C:", "[*N:", "[*S:", "[*I:");
            while(strpos($str, $prefix[$i]) !== false) {
                $result = strBetween($str, $prefix[$i], "*]");
                $arr = explode(",", $result, 2);
                if(count($arr) != 2)
                    break;
                if($i == 3)
                    $replace = randInteger((int)$arr[0], (int)$arr[1]);
                else
                    $replace = randAll($i, mt_rand((int)$arr[0], (int)$arr[1]));
                $str = str_replace_once($prefix[$i].$result."*]", $replace, $str);
            }
        }
        //獲取系統時間
        while(strpos($str, "[*D:") !== false) {
            $result = strBetween($str, "[*D:", "*]");
            $replace = date($result);
            $str = str_replace("[*D:".$result."*]", $replace, $str);
        }
        return $str;
    }
    private $format;
    private $rules;
    private $const;
}

Functions.php

<?php

// 從一個字符串中取出兩個子字符串中間的字符串
function strBetween($str, $left, $right) {
    $leftPos = strpos($str, $left);
    $leftLen = strlen($left);
    $rightPos = strpos($str, $right, $leftPos + $leftLen);
    if($leftPos === false || $rightPos === false)
        return "";
    return substr($str, $leftPos + $leftLen, $rightPos - $leftPos - $leftLen);
}

// str_replace的僅替換一次的版本
function str_replace_once($search, $replace, $subject) {
    $pos = strpos($subject, $search);
    if($pos === false)
        return $subject;
    return substr_replace($subject, $replace, $pos, strlen($search));
}

// 生成指定數量的隨機漢字,返回字符串
function randChinese($number) {
    mt_srand();
    $randStr = "";
    for(; $number > 0; $number--)
        //取隨機GBK中文
        $randStr .= chr(mt_rand(176, 218)).chr(mt_rand(176, 218));
    //轉換爲UTF-8
    $randStr = iconv("GB2312", "UTF-8", $randStr);
    return $randStr;
}

// 生成指定數量的隨機數字,返回字符串
function randNumber($number) {
    mt_srand();
    $randStr = "";
    for(; $number > 0; $number--)
        $randStr .= chr(mt_rand(48, 57));
    return $randStr;
}

// 生成指定範圍的整數
function randInteger($min, $max) {
    return (string)mt_rand($min, $max);
}

// 生成指定數量的隨機英文字母,type爲0則大小寫隨機,爲1大寫,爲2小寫。返回字符串。
function randAlphabet($number, $type) {
    mt_srand();
    $randStr = "";
    loop: if($number == 0)
        return $randStr;
    if($type == 0) {
        //大小寫隨機
        if(mt_rand(0, 1) == 0)
            goto lower;
        goto upper;
    }
    //大寫字母
    if($type == 1) {
        upper: $randStr .= chr(mt_rand(65, 90));
        goto sub;
    }
    //小寫字母
    if ($type == 2){
        lower: $randStr .= chr(mt_rand(97, 122));
    } else {
        return "";
    }
    sub: $number--;
    goto loop;
}

// 生成指定數量的隨機字符,包括半角數字和大小寫字母。返回字符串。
function randChar($number) {
    mt_srand();
    $randStr = "";
    for(; $number > 0; $number--) {
        $case = mt_rand(0, 2);
        if($case == 0)
            goto upper;
        if($case == 1)
            goto lower;
        num: $randStr .= chr(mt_rand(48, 57));
        continue;
        upper: $randStr .= chr(mt_rand(65, 90));
        continue;
        lower: $randStr .= chr(mt_rand(97, 122));
    }
    return $randStr;
}

function randAll($type, $arg) {
    if($type == 0)
        return randChinese($arg);
    if($type == 1)
        return randNumber($arg);
    return randChar($arg);
}


閲完此文,您的感想如何?
  • 有用

    0

  • 沒用

    0

  • 開心

    0

  • 憤怒

    0

  • 可憐

    0

1.如文章侵犯了您的版權,請發郵件通知本站,該文章將在24小時内刪除;
2.本站標注原創的文章,轉發時煩請注明來源;
3.交流群: 2702237 13835667

相關課文
  • mac開發接入微信公衆號接口返回報錯 cURL error 56: SSLRead() return error -9806

  • PHP的換行符是什麽

  • pecl安裝程序時報錯Array and string offset access syntax with curly braces is no longer supported

  • 由於商家傳入的H5交易參數有誤,該筆交易暫時無法完成,請聯繫商家解決

我要說說
網上賓友點評