覚えておくと便利なPHPの関数まとめ3


文字エンコードを変換する (mb_convert_encoding()関数)

mb_convert_encoding()関数 - 文字エンコードを変換する関数

$text = 'あいうえお';
$sjis = mb_convert_encoding($text, 'SJIS');// 文字コードをSJISに変えた
$utf8 = mb_convert_encoding($sjis, 'UTF-8', 'SJIS');// 文字コードをSJISからUTF-8に変えた

文字列を暗号化したい MD5()関数, sha1()関数, hash()関数, crypt()関数

MD5()関数 - 文字列を暗号化する関数 (md5ハッシュ値を計算する)
sha1()関数 - 文字列の sha1 ハッシュを計算する
hash()関数 - ハッシュ値 (メッセージダイジェスト) を生成する (PHP5.12から?)
crypt()関数 - 文字列の一方向のハッシュ化を行う

$moji = '文字列';
echo MD5($moji);
echo sha1($moji);
結果
a973a7fd4d27ccdfce027f329015f5da
9a866189362908dca937581b0e42a404e5ae7f80

PHPマニュアルによるとMD5()関数やsha1()関数はパスワードには
向いていない(解読されやすい)ので使用しないほうがよいと書いてあります

では、パスワードには何を使うのがよいのでしょうか?
PHPマニュアルによると hash()関数か crypt()関数を使うのが良いとされていました

crypt()関数は、PHP5.37バージョンで致命的な欠陥があり、PHP5.37バージョンでcrypt()関数を使用した場合
パスワードがどんな文字列でもログインできてしまう重大なバグがあるため使用しないほうが懸命です

パスワードを暗号化する例
$pass = 'password';
$pass2 = MD5($pass);//まずMD5しときます
5f4dcc3b5aa765d61d8327deb882cf99 ←MD5()でできた暗号化された文字列($pass2)

$pass3 = 'kaidoku'.$pass2.'dekinai'; ← $pass2の前後に適当な文字列を追加します

$super_pass = hash('sha256',$pass3); ← $pass3にさらにhash関数で暗号化します

暗号化したもの
4415112bb155c77283bd8afcd72ae1e49c52667653ac89ef094d8c5c3003ce4e


上記の2重で暗号化した手法は、「ソルトアンドペッパー」といい
2回にわたって、暗号化する立派な手法です

暗号を解読されないようにするには、
暗号化したものを解読する手順を増やし、解読する行為を困難にすることです!

10進数を16進数にする またはその逆 (dechex()関数,hexdec()関数)

dechex()関数 — 10 進数を 16 進数に変換する
hexdec()関数 — 16 進数を 10 進数に変換する

hexdec()関数 を使用して16進数を10進数に変換する 例
$color = 'FFE8E8';
$henkan = str_split($color,2); //2文字づつ分解して $henkanにいれた
foreach($henkan as $key=>$val){
	$RGB[] = hexdec($henkan[$key]);
//分解したものをRGB値(10進数)にした
}
ここでは $RGB[0] = 255 $RGB[1] = 232 $RGB[2] = 232 となった

dechexで10進数を16進数に変換する例
$G = 255;
$B = 255;
while($G >= 16){
echo '<span style="color:#FF'.dechex($G).dechex($B).';">■</span>';
$G = $G-5;
$B = $B-5;
}

結果

ランダムな値を発生させる (mt_rand()関数)

mt_rand()関数 - ランダムな数値を発生させる(範囲の指定可能)

mt_srand((double) microtime() * 100000);//数値をよりランダムにするためのおまじない
echo mt_rand();
echo mt_rand(1,20);//1~20の間でランダム数値作成
結果
1163166064
12

文字列の中に指定文字列が含まれているか調べる (mb_strpos()関数)

mb_strpos()関数 - 検索文字列が指定文字列の中に含まれているか調べる関数

$text = 'どらえもーん!助けて~またジャイアンにいじめられたよ・・・・';
if(mb_strpos($text,'ジャイアン')){
	echo 'また、ジャイアンにいじめられたの?';
}else{
	echo 'ジャイアンって誰?';
}
結果
また、ジャイアンにいじめられたの?

数値を四捨五入したり、切捨てたりする (round()関数,ceil()関数,floor()関数)

round()関数 - 数値を丸める(四捨五入みたいなもの)関数
ceil()関数 - 数値の小数点以下を切り上げる関数
floor()関数 - 数値の小数点以下を切り捨てる関数

$int = 1.42;
echo round($int);//四捨五入っぽいもの(厳密に言うと違う)
echo ceil($int);//切り上げ
echo floor($int);//切捨て
結果
1
2
1

数値型かどうかを調べる (is_int()関数)

is_int()関数 - 変数が数値型なのかを判別する関数

$int = 5;
if(is_int($int)){
	echo '数値型です';
}else{
	echo '数値型ではない';
}
結果
数値型です

指定する日付が存在するのか調べる (checkdate()関数)

checkdate()関数 - 調べる日付が存在するのか?調べる関数

$year = 2013;
$month = 11;
$day = 31;
if(checkdate($month, $day, $year)){
	echo '存在する日付です';
}else{
	echo '存在しない日付です';
}
?>
結果
存在しない日付です

ファイルが存在するか?調べる (file_exists()関数)

file_exists()関数 - ファイルが存在するのか調べる関数
フォルダ(ディレクトリ)も調べられる

$file = 'test.html';
if(file_exists($file)){
	echo '存在するファイル';
}else{
	echo '存在しないファイル';
}

バックスラッシュを取り除く (stripslashes()関数)

stripslashes()関数 - 文字列中のバックスラッシュを取り除く関数

if (get_magic_quotes_gpc()) {
 $str = stripslashes($str); 
 } 

文字列を繰り返し表示する (str_repeat()関数)

str_repeat()関数 - 文字列を繰り返して表示する

echo str_repeat('★',20);
結果
★★★★★★★★★★★★★★★★★★★★

アルファベットの大文字,小文字の変換 strtoupper()関数,mb_strtoupper()関数,strtolower()関数,mb_strtolower()関数

strtoupper()関数 - アルファベットを大文字にする
strtolower()関数 - アルファベットを小文字にする
mb_は マルチバイト用
注 : マルチバイト関連の関数は必ず文字コードを指定すること

$str = 'amazon';
echo strtoupper($str);
echo strtolower('YAHOO!JAPAN');
結果
AMAZON
yahoo!japan

文字列をエスケープするユーザー関数(配列もまとめてhtmlspecialchars)

自分用のメモ

//エスケープ用関数 (配列もまとめてhtmlspecialchars)
function h($str){
    if(is_array($str)){
        return array_map( "h",$str);
    }else{
        return htmlspecialchars($str,ENT_QUOTES,'UTF-8');
    }
}

実験
$abc = array('太字','打ち消し線','アンダー線');
//実際の中身は('<b>太字</b>','<s>打ち消し線</s>','<u>アンダー線</u>')
$abc = h($abc);
echo $abc[1];
結果 <s>打ち消し線</s>

var_dump()といちいちタイプするのが面倒くさい人のための関数

var_dump()を,d()で発動するユーザー関数

//デバッグ用ユーザー関数
function d() {
    echo '<pre style="background:#35F;color:#fff;border:1px solid #ccc;margin:5px;padding:5px;">';
	echo 'デバッグの結果<br />';
    foreach (func_get_args() as $v) var_dump($v);
    echo '</pre>';
}
実験
$hairetu = array('ごはん','味噌汁','焼き魚');
d($hairetu);
結果
デバッグの結果
array(3) { [0]=> string(9) "ごはん" [1]=> string(9) "味噌汁" [2]=> string(9) "焼き魚" }

今現在の時間を表示する(曜日を漢字表記)ユーザー関数

現在の時間を表示するユーザー関数(曜日を漢字表記で)

//この関数を呼び出すときは date_now();と記述して下さい
function date_now(){
	date_default_timezone_set('Asia/Tokyo');//東京時間に設定
	$youbi = array('日','月','火','水','木','金','土');
	echo  date("Y年m月d日({$youbi[date(w)]}) G時i分");
}
//ユーザー関数作成ここまで

date_now();

結果

Notice: Use of undefined constant w - assumed 'w' in /home/member/sitemix_55218/site/matome3.php on line 417
2018年11月21日(水) 16時59分

PHPを使って経度と緯度を求める (googleAPI使用)

googleAPIをつかって住所から経度と緯度を求める
(グーグルマップをホームページに載せたい時に便利)

//経度、緯度ゲット
$addr = '東京都千代田区';
$p = urlencode($addr);
$xml = simplexml_load_file("http://www.geocoding.jp/api/?q=$p");
$keido = $xml->coordinate->lat;//経度
$ido = $xml->coordinate->lng;//緯度


文字列に半角が混ざっているか調べる関数


文字列が全角のみで構成されているのかチェックするユーザー関数
check_zenkaku関数 - 文字列が全角のみで構成されているか調べる(ユーザー関数)

正規表現について
ここで作成している関数は自分用のメモ書きです(間違っていても知りません!)
使用する際は自己責任でおねがいします

//文字列に半角が混ざっているか調べる関数(UTF-8用)
//半角が混ざっていなければ(全角のみで構成の場合)TRUEが返ってきます
function check_zenkaku($str){
mb_regex_encoding("UTF-8");//正規表現用のエンコーディングを取得
if (!preg_match("/(?:\xEF\xBD[\xA1-\xBF]|\xEF\xBE[\x80-\x9F])|[\x20-\x7E]/", $str)) {
	return TRUE;
}else{
	return FALSE;
	}
}

実験
$mazari = '東京1105 ヤマダタカオ';
if(check_zenkaku($mazari) === TRUE){
	echo '全角のみで構成されています';
}else{
	echo '半角文字が混ざっています';
}
結果
半角文字が混ざっています

おまけ(全角カタカナのみを判別)

//全角カタカナの判別(全角スペースはOK)
function zen_kana($str){
mb_regex_encoding("UTF-8");//正規表現用のエンコーディングを取得
if(preg_match("/^[ァ-ヶー ]+$/u", $str)){
	return TRUE;
} else {
	return FALSE;
	}
}

おまけ2(メールアドレスの簡易チェック)
//メールチェック(簡易版)
function check_mail($str){
if(preg_match("/^[a-zA-Z0-9!$&*.=^`|~#%'+\/?_{}-]+@([a-zA-Z0-9_-]+\.)+[a-zA-Z]{2,6}$/",$str)){
	return TRUE;
} else {
	return FALSE;
	}
}