[PHP]異なる改行コードの置換と配列への変換

改行コードは通常「LF(\n)」「CR(\r)」「CR+LF(\r\n)」などが有り、「\n」だけを置換すると「\r」が残ってしまう場合があります。

preg_replace や preg_split などで改行を扱う場合は大文字の「\R」を使うと3種類の改行コードをまとめて指定出来ます。

<?php
$res = preg_split("/\R/", "sample\nsample\rsample\r\nsample");
print_r($res);
Array ( [0] => sample [1] => sample [2] => sample [3] => sample ) 

[PHP]画像を上下反転、左右反転する(垂直・水平方向の鏡像)

最初にこの記事を書いた時点では GD による画像反転の関数は用意されていなかったので独自に imageflip() という関数を書いたのがこの記事です。
しかし PHP 5.5 以降で全く同じ名前の関数 imageflip() が使えるようになりました。

使い方は簡単で imageflip() に画像リソースと反転方向を与えるだけです。

<?php
$file	 = "sample.jpg";
$image	 = imagecreatefromjpeg($file);
imageflip($image, IMG_FLIP_HORIZONTAL);

header("Content-type: image/jpeg");
imagejpeg($image);
imagedestroy($image);

反転方向の指定は水平反転を行う IMG_FLIP_HORIZONTAL、垂直反転を行う IMG_FLIP_VERTICAL、両方を行う IMG_FLIP_BOTH の3つです。

PHP 5.5より古いバージョンであっても画像の拡大縮小コピーを行う関数 imagecopyresampled のコピー元の幅や高さにマイナスを指定することで反転を行うことができます。

<?php
function imageflip_alt(&$image, $direction, $alpha=false){
	$width	 = imagesx($image);
	$height	 = imagesy($image);

	$new_image = imagecreatetruecolor($width, $height);
	
	// PNGなどの不透明度情報を持つ場合
	if($alpha){
		imagealphablending($new_image, false);
		imagesavealpha($new_image, true);
	}
	
	if($direction === 'vertical'){
		imagecopyresampled($new_image, $image, 0, 0, 0, $height - 1,
			$width, $height, $width, -1 * $height);
	} else if($direction === 'horizontal'){
		imagecopyresampled($new_image, $image, 0, 0, $width - 1, 0,
			$width, $height, -1 * $width, $height);
	} else if($direction === 'both'){
		imagecopyresampled($new_image, $image, 0, 0, $width - 1, $height - 1,
			$width, $height, -1 * $width, -1 * $height);
	} else {
		return false;
	}
	
	imagedestroy($image);
	$image = $new_image;
	
	return true;
}

$file	 = "sample.jpg";
$image	 = imagecreatefromjpeg($file);
imageflip_alt($image, 'horizontal');

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

imagejpeg($image);

imagedestroy($image);

sample
元画像(sample.jpg)

horizontal
水平反転

vertical
垂直反転

使い方は、imageflip( 画像リソース, 方向 ) のように指定します。PNG 画像の場合は第三引数 $alpha を true にして下さい。 方向にはそれぞれ vertical(垂直)、horizontal(水平)、both(両方)が指定出来ます。

単に幅や高さをマイナスにするだけでは 1 ピクセルだけずれてしまうので座標を修正しています。

[PHP]htmlspecialchars()を使うと文字が消える?

HTMLとして文字を出力する際によく使われる htmlspecialchars() ですが、
使った時に変数の内容が全て消えてしまう時があります。

<?php
mb_internal_encoding('UTF-8');
$text = "これはテストです";
$text = mb_convert_encoding($text, 'SJIS', 'UTF-8');
echo htmlspecialchars($text, ENT_QUOTES);

上記サンプルは UTF-8 で保存されたプログラムです。
文字を mb_convert_encoding() で Shift_JIS に変換して出力しようとしていますが、文字は全く表示されません。

解決方法は htmlspecialchars() の第 3 引数を省略しないで指定することです。
第 3 引数には文字エンコーディングを指定します。上記の場合は、次のように指定することで適切に表示することができます。

htmlspecialchars($text, ENT_QUOTES, 'SJIS')

この引数を省略すると、PHP 5.4.0 より前のバージョンでは ISO-8859-1 、PHP 5.4.0 以降では UTF-8 が指定されます。
そして、指定されたエンコーディングとして有効でない文字は切り捨てられます。

一応 ENT_IGNORE を 第 2 引数(flags)に指定することでもこの切り捨てを回避することはできますが、XSS(クロスサイトスクリプティング)などの脆弱性を生む可能性があるので使うべきではありません。