[PHP]文字の種類ごとに最低1つ以上使ったランダム文字列

前回単純なランダム文字列を作成しましたが、状況によっては数字・小文字・大文字・記号を
それぞれ最低1つ以上含んだものを生成したい場合があると思います。

所々無理矢理な感じはありますが、とりあえずこんなソースになりました。

<?php
function generate_password($length=10){
  $char = array();

  //使用する文字列
  $char[] = range(0,9);
  $char[] = range('a','z');
  $char[] = range('A','Z');
  $char[] = array('_', '-');

  $list   = array();
  $merge   = array();
  $count   = 0;

  foreach($char as $arr){
    shuffle($arr);
    $list[] = $arr[0];
    $merge = array_merge($merge, $arr);
    $count++;
  }
  
  $flip = array_flip($merge);
  while($count< $length){
    $list[] = array_rand( $flip, 1);
    $count++;
  }
  shuffle($list);
  return implode("", $list);
}

//文字数を指定して生成
echo generate_password(12);

文字のグループを $char に配列として指定します。
この場合は数字・小文字・大文字・記号をそれぞれ1つ以上使う設定です。

単純に各グループからランダムで1文字ずつ取得し、残りをグループ関係なくランダムに埋めています。

もっとスマートなやり方があると思うのでご存知の方はコメントお願いします。

[PHP]ランダムな文字列の生成

任意の文字列を組み合わせてランダムな文字列を生成する場合、
方法は幾つもありますがシンプルなのはこのようなものだと思います。

<?php
//生成する文字数
$length = 10;

//使用する文字
$char = '1234567890abcdefghijklmnopqrstuvwxyz';

$charlen = mb_strlen($char);
$result = "";

for($i=1;$i<=$length;$i++){
  $index = mt_rand(0, $charlen - 1);
  $result .= mb_substr($char, $index, 1);
}

echo $result;

数字とアルファベットの小文字の中から10文字選んでいます。
もし大文字のアルファベットも使用したい場合は $char に書き足します。

より複雑なランダム文字列の生成については次回に続きます。

[PHP]文章中の単語に自動でリンクを貼る(キーワードリンク)

よくコンピュータ系のサイトで専門用語に解説ページへのリンクが貼られているのを見かけますが、構造的には単語と URL を用意しておき、当てはまる単語にリンクを貼るというものです。

単純に組むとすでに置換した単語を二重に置換してしまうので、少し工夫が必要になります。

<?php
//元となる文章
$str = "ウェブブラウザとはウェブサイトを閲覧するためのソフトウェアです";
 
//単語とURLのリスト
$wordlist = array(
  "ウェブ" => "http://en.wikipedia.org/wiki/Web",
  "ウェブブラウザ" => "http://en.wikipedia.org/wiki/Web_browser",
  "ウェブサイト" => "http://en.wikipedia.org/wiki/Website",
  "ソフトウェア" => "http://en.wikipedia.org/wiki/Software"
);
 
//単語の文字数が長いものから順に並べ替える
uksort($wordlist, function($a, $b){
	return mb_strlen($b, 'utf-8') - mb_strlen($a, 'utf-8'); });

$pairs = array();

foreach($wordlist as $word => $url){
	$pairs[$word] = '<a href="' . $url . '">' . $word . '</a>';
}

$str = strtr($str, $pairs);
echo $str;

今回は「ウェブブラウザとはウェブサイトを閲覧するためのソフトウェアです」という文の用語にリンクをつけています。
単語は配列に $wordlist 登録し、キーが対象語句、値がリンク先です。

途中文字の長い順に単語を並び替えていますが、そうしておかないと「ウェブブラウザ」を置換するより先に「ウェブ」だけが置換され、「ブラウザ」の文字が取り残されてしまうからです。


(2014/05/07 加筆)

コメントで教えていただきましたが strtr は基本的にマルチバイト非対応の関数のため、文字コードによっては誤作動を起こす場合があるようです。
その場合は以下のマルチバイト対応版 mb_strtr() を使うことをおすすめします。

参考: 「マルチバイト未対応の関数をいろいろ対応させてみた」
http://qiita.com/mpyw/items/ceae0ed5285093c76087#2-7