BIND+PHPによるDiCEで更新可能なダイナミックDNSサーバ構築でも使ってるランダムな文字列を生成する関数をちょっとだけ高機能にしてみた。

高機能ってゆっても、生成される文字列を「英数混在・アルファベット・大文字・小文字・数字」の5パターンを選べるようにしただけやけども。

<?php
/*******************************************************************
Name    :function rand_str($keta,$type)
Action    :$keta桁のランダム文字列を生成する。
     $typeで英数混在・英字のみ・大文字のみ・小文字のみ・数字のみ
     の4種類を指定
      $type ==  all   or 0 or null    :英数混在
      $type ==  ab    or 1        :英字のみ
      $type ==  caps  or 2        :大文字のみ
      $type ==  small or 3        :小文字のみ
      $type ==  num   or 4        :数字のみ
Call    :makepw(int $桁数 str $keta)
Return    :(str)$ランダム文字列
Revision:
    1.00    とりあえず。

                     2007.08.19 Ver1.00 Genki wrote
                     http://www.genkikko.net/
********************************************************************/
function rand_str($keta,$type){
    if(!$keta){
        $keta = 8;
    }
    mt_srand((double)microtime()*1000000);        //乱数初期化
    if($type == "all" || !$type){
        //英数混在
        for($i=0,$str=null;$i<$keta;){        //ループ
            $num=mt_rand(0x00,0x7A);    //ASCIIコードで0-9a-zA-Z:;<=>?@[\]^_`の部分
            if((0x30<$num&&$num<0x39) || (0x41<$num&&$num<0x5A) || (0x61<$num&&$num<0x7A)){    //文字コード英数の範囲内なら
                $str.=chr($num);    //$strの後ろにキャラクタに変更して追加。
                $i++;            //文字数カウンタをインクリメント
            }
        }
        return ($str);                //strを返す
    }elseif($type == "ab" || $type == 1){
        //英字のみ
        for($i=0,$str=null;$i<$keta;){        //ループ
            $num=mt_rand(0x30,0x7A);    //ASCIIコードでa-zA-Z:;<=>?@[\]^_`の部分
            if((0x41<$num&&$num<0x5A) || (0x61<$num&&$num<0x7A)){    //アルファベットの範囲内なら
                $str.=chr($num);    //$strの後ろにキャラクタに変更して追加。
                $i++;
            }
        }
        return ($str);                //strを返す
    }elseif($type == "caps" || $type == 2){
        //大文字のみ
        for($i=0,$str=null;$i<$keta;){    //ループ
            $num=mt_rand(0x41,0x5A);    //ASCIIコードでA-Zの部分
            $str.=chr($num);        //$strの後ろにキャラクタに変更して追加。
            $i++;                //文字数カウンタをインクリメント
        }
        return ($str);                //strを返す
    }elseif($type == "small" || $type == 3){
        //小文字のみ
        for($i=0,$str=null;$i<$keta;$i++){    //ループ
            $num=mt_rand(0x61,0x7A);    //ASCIIコードでa-zの部分
            $str.=chr($num);        //$strの後ろにキャラクタに変更して追加。
        }
        return ($str);                //strを返す
    }elseif($type == "num" || $type == 4){
        //数字のみ
        for($i=0,$str=null;$i<$keta;$i++){    //ループ
            $str.=mt_rand(0,9);        //$strの後ろに数字を追加。
        }
        return ($str);                //strを返す
        
    }else{
        //タイプの指定が悪い
        return("error:bad type.");
    }


}
?>



テストしてみるスクリプトを書く。
<?php

include("rand_str.php");
echo "英数混在<br>",
    rand_str(100),"<br>",
    rand_str(100,0),"<br>",
    rand_str(100,all),"<br><br>",

    "アルファベット<br>",
    rand_str(100,1),"<br>",
    rand_str(100,ab),"<br><br>",

    "大文字<br>",
    rand_str(100,2),"<br>",
    rand_str(100,caps),"<br><br>",

    "小文字<br>",
    rand_str(100,3),"<br>",
    rand_str(100,small),"<br><br>",

    "数字<br>",
    rand_str(100,4),"<br>",
    rand_str(100,num);

?>

動かすとこうなる。

とりあえずのパスワードの発行とか、軽い掲示板のスパム避けなんかに使えるんじゃないかと。