Tomo のすべての投稿

拡張子の直前に文字列を追加 (PHP)

ファイル名の変更など(rename等)で古いファイルに文字列を追加して、別名として残しておきたい場合、以下のような関数でファイル名を作成し、リネームを行うと便利です。
例えば、拡張子の前に_oldを追加する場合の関数です。

function add_filename($filename,$addtext){
	//拡張子の前に文字列を追加
	$pos  = strrpos($filename, '.'); // .が最後に現れる位置
	if ($pos){
		return(substr($filename, 0, $pos).$addtext.substr($filename, $pos));
	}else{
		return($filename.$addtext);
	}
}

上記を用いて、sample.txtをsample_old.txtに変換します。

$fn = 'sample.txt';
rename($fn,add_filename($fn,'_old'));

日付などを追加してみてもよいかと思います。

メールアドレスのチェック (PHP)

フォームなどから入力されたメールアドレスを示す文字列が妥当かどうかをチェックするための正規表現を使ったチェック関数です。

function valid_mail($email){
	if (preg_match("/^[_a-z0-9-]+(¥.[_a-z0-9-]+)*@[a-z0-9-]+([¥.][a-z0-9-]+)+$/i", $email)){
		return true;
	}else{
		return false;
	}
}

簡易的なものですが、ないよりはましということで。
docomoなどは少々イレギュラーなメールアドレスの取得を容認してきた過去があるので、あまり厳密にするのも現実的ではないかもしれません。

sendmailで改行が増える? (PHP)

PHPからsendmailを使ってメールを (メールフォームなどから) 送る際に、pop受信時のみ、改行がなぜか増えてしまうことがありました。Webメールなどではそういう現象なかったので調べてみましたが、改行コードの扱いの違いが原因らしいことがわかりました。
このサイトを参考に以下のように改行コードを修正、統一することで無事に解決しました。

$s = str_replace(array("\r\n", "\r"), "\n", $s);

例では文字列を$sとしています。上記の様に文字列中の改行コードを統一して対応しました。

異なる階層から、ライブラリを読み込む (PHP)

特定のディレクトリにライブラリ等を保存している場合、異なる階層から、includeしたいときがあります。
例えば、
/home/example/www
以下に
/lib
/a/b
/c
などがあり、/a/bや/cなど階層が異なるディレクトリにあるPHPスクリプトから/lib内のライブラリを読み込みたい場合は、

<?php
$lib = $_SERVER['DOCUMENT_ROOT'] . "/lib";
set_include_path(get_include_path() . PATH_SEPARATOR . $lib);
include( "hoge.php" );
?>

でincludeすることができます。
MobableTypeなど、記事をディレクトリで管理する場合などで、共通に使用できます。

imagecreatefromstring (PHP)

画像ファイルをバイナリデータとしてデータベースなどに保存した場合、下記のようにヘッダを加え、保存したデータを加えると、画像ファイルそのものをブラウザに出力することができます。

header("Content-Type: image/jpeg");

そのとき、何らかの処理をしたい場合は imagecreatefromstring を使うと便利です。本来であれば、テンポラリファイルを作成、加工、出力、テンポラリファイル削除、といった手順が必要になりますが、その手間を省くことができます。 テーブル名:TABLE、項目名:JPEG、ID:123の画像を横幅100pxに縮小して表示する場合の例です。 続きを読む imagecreatefromstring (PHP)

sortの挙動 (PHP)

配列の並び替えsortを使う際には、データの形式に注意しましょう。2 番目のパラメータの指定によって挙動は下記のように変化します。

  • SORT_REGULAR 通常通りに項目を比較
  • SORT_NUMERIC 数値的に項目を比較
  • SORT_STRING 文字列として項目を比較

文字列として入っていた数値を並び替える場合(たとえば少数など)は明示的にSORT_NUMERICとする必要があります。

sort($array,SORT_NUMERIC)

このようにして数値として並び替えます。

実行時間の測定 (PHP)

処理にかかる時間を計りたいときは以下のようにします。
どれくらい正確かは不明ですが、かなり細かく計測できます。

$start = microtime(TRUE);
//いろいろな処理
$stop = microtime(TRUE);
print ($stop-$start);

分単位または数十秒単位ならtime();でも可能です。

2015/1/28修正
microtime()の引数にTRUEを指定しました。デフォルトではFALSEが指定され、この場合、文字列として返されるため、引き算ができません。

文字列中に指定した文字が何回出現するか (PHP)

文字列中に指定した文字が何回出現するかを確認するためにはsubstr_countを使います。

substr_count('123/13/222/3', '/');

結果は4となります。区切り文字等を数えて、項目数を数えたりできます。もちろん、検索する文字は2文字以上でも可能です。ただし、重なる場合は1つとカウントされます。

substr_count('abcabcabc', 'abcabc');

この場合の結果は1です。

半角文字から全角文字を取り除く (PHP)

文字列の中の全角文字をを取り除くか、別の文字に変換するために以下のようにしてみました。mb_strlenとstrlenを使っています。

$line = 123あいう456
$newline = '';
for ($i = 0;$i <= mb_strlen($line);$i++){
	if (strlen(mb_substr($line,$i,1)) == mb_strlen(mb_substr($line,$i,1))){
		$newline .= mb_substr($line,$i,1);
	}else{
		$newline .= 'a';
	}
}

結果は 123aaa456となります。
else内を消せば、結果は123456です。
単純に半角にするだけならmb_convert_kanaが使えます。半角に対応のない全角文字を消去または置き換える場合には使えません。