[PHP]正規表現の全体一致は「^~$」だけでは不十分

preg_match() などの正規表現で「abcd」に一致するパターンの書き方は「^abcd$」というのが一般的ですが、ラインフィードなどの記号が混じっていた場合すり抜けてしまうケースが有るようです。

[参考サイト]
「正規表現によるバリデーションでは ^ と $ ではなく \A と \z を使おう」
http://blog.tokumaru.org/2014/03/z.html

<?php
$value = "abcd\n";
echo strlen($value);

if( preg_match('/^abcd$/', $value) ){
	echo 'OK';
} else {
	echo 'NG';
}

if( preg_match('/\Aabcd\z/', $value) ){
	echo 'OK';
} else {
	echo 'NG';
}

上が「^~$」を使った通常のパターンで、下は「\A~\z」を使ったパターンです。
通常のパターンではチェックをすり抜けて「OK」となってしまいますが、改行コードが末尾に付いているため文字数をカウントすると5文字になっています。
これは GET で「index.php?value=abcd%0a」のように受け取る場合でも同様です。

[PHP]htmlspecialchars()を行った上でprintf()する

PHP で html を出力するする際、htmlspecialchars() を使ってクロスサイトスクリプティング(XSS)対策を行うのは基本的ですが、printf() や sprintf() で出力をする場合全ての値に htmlspecialchars() を行うと可読性が著しく下がってしまうので、特殊文字を変換した上で printf()、sprintf() をするための関数を作ってみました。

<?php
printfh('<a href="%s" class="%s">%s</a>',
	'https://php-archive.net','sample', '<test>');

function printfh(){
	$args = func_get_args();
	$text = array_shift($args);
	$args = array_map('h', $args);
	vprintf($text, $args);
}

function sprintfh(){
	$args = func_get_args();
	$text = array_shift($args);
	$args = array_map('h', $args);
	return vsprintf($text, $args);
}

function h($str, $encoding=null){
	if(empty($encoding)) $encoding = mb_internal_encoding();
	$str = htmlspecialchars($str, ENT_QUOTES, $encoding);
	return $str;
}
実行結果: 
<a href="https://php-archive.net" class="sample">&lt;test&gt;</a>

使い方は printf() などとほぼ同じです。
第一引数にフォーマットを記入し、第二引数以降に代入する文字を追加していきます。(可変長引数)

[PHP]指定した日時まであと何日(何時間)あるかを調べてカウントダウンする

タイムセールやイベント告知などで指定した日や時刻まで後どのくらい期間があるかを計算したい場合、DateTime クラスの diff() 関数を使うと簡単に得ることができます。
DateTime クラスは日時計算や整形出力に関するクラスです。下記サンプルの実行には PHP 5.3 以上が必要です。
2038年問題にも対応する関数なので今後必須になってくると思います。

<?php
date_default_timezone_set("Asia/Tokyo");

$datetime = new DateTime('2030/01/01 00:00:00');
$current  = new DateTime('now');
$diff     = $current->diff($datetime);

printf('残り %d年%dヶ月%d日 %d時間%d分%d秒(%d日)',
	$diff->y, $diff->m, $diff->d, $diff->h,$diff->i,$diff->s, $diff->days);
実行結果: 残り 15年8ヶ月13日 9時間49分8秒(5736日)

DateTime クラスをインスタンス化する際に、日時を引数として渡します。省略した場合は現在の日時が入ります。(デフォルトは「now」)

diff() はオブジェクトを返し、プロパティとして y や h などの日時を持ちます。