ラベル string の投稿を表示しています。 すべての投稿を表示
ラベル string の投稿を表示しています。 すべての投稿を表示

2011年1月21日金曜日

PHPで文字列をパディング (ゼロ埋め、スペース埋め等)


PHPで、文字列や数字を規定の桁数にするために、スペースやゼロなど任意の文字でパディングする方法。

PHPでゼロ埋め(ゼロ パディング)を書いたときにはよくわかっていなかったけど、久しぶりにsprintf()のマニュアルを見たらやっとsprintf() / printf()の使い方がわかった。
でも、単純なゼロ埋めならstr_pad()の方が分かりやすい。(右寄せならsprintf()の方が短いけど。)


str_pad()の場合

$value = 123;
$len = 5;

//デフォルトはスペース埋め
echo str_pad($value, $len); // => "123  "

//指定した文字で埋める
echo str_pad($value, $len, '*'); // => "123**"

//右寄せにするなら第4引数で指定
echo str_pad($value, $len, '0', STR_PAD_LEFT); // => "00123"
変わったところでは左右の両方を埋めるというオプションもある。
$value = '(^o^)';
$len = 9;

echo str_pad($value, $len, 'w', STR_PAD_BOTH); // => "ww(^o^)ww"


sprintf()の場合
$value = 123;
$len = 5;

//デフォルトは右寄せのスペース埋め
echo sprintf("%{$len}s", $value); // => "  123"

//左寄せにするならマイナスを付ける
echo sprintf("%-{$len}s", $value); // => "123  "

//ゼロ埋めの場合はゼロを付ける
echo sprintf("%0{$len}s", $value); // => "00123"

//十進数ならsでなくdの方がいい?
echo sprintf("%0{$len}d", $value); // => "00123"

//スペースとゼロ以外で埋めたい場合、埋めたい文字の前にシングルクォートを付ける
echo sprintf("%'*{$len}s", $value); // => "**123"
sprintf()はパディング専用ではなく文字列フォーマット用関数なので、他にもオプションがある。詳しくはsprintf()のマニュアル参照。

2009年12月15日火曜日

PHPで GDを使って画像ファイルに文字列を書き込む例

とりあえずよく使いそうな機能はこんなとこか。
楕円書いたりいろいろできるみたいだけど、使うかな?
四隅を角丸にしたいかも...

<?php
$string = 'こんにちはこんにちは!';
$fontSize = 12;
$padSize = 10;
$angle = 0; //角度を指定できる
$fontPath = 'C:/WINDOWS/Fonts/MSGOTHIC.TTC'; //Windowsの場合

try {
//文字列の大きさを取得 http://jp2.php.net/imageTtfBBox
$box = imageTtfBBox($fontSize, $angle, $fontPath, $string);
if ($box === false) {
throw new Exception('imageTtfBBox()失敗');
}
$boxWidth = abs($box[2] - $box[0]);
$boxHeight = abs($box[7] - $box[1]);

//キャンバス生成 http://jp2.php.net/imageCreateTrueColor
$width = $boxWidth + $padSize * 2;
$height = $boxHeight + $padSize * 2;
$img = imageCreateTrueColor($width, $height);
if ($img === false) {
throw new Exception('imageCreateTrueColor()失敗');
}

//背景色と文字色をそれぞれ造る
// http://jp2.php.net/imageColorAllocate
// http://jp2.php.net/imageColorAllocateAlpha (透過の場合)
$red = 0xFF;
$green = 0x00;
$blue = 0x00;
$bgColor = imageColorAllocate($img, $red, $green, $blue);
if ($bgColor === false) {
throw new Exception('imageColorAllocate()失敗');
}
$red = 0xFF;
$green = 0xFF;
$blue = 0xFF;
$alpha = 20; //0~127。127は完全に透明
$textColor = imageColorAllocateAlpha($img, $red, $green, $blue, $alpha);
if ($textColor === false) {
throw new Exception('imageColorAllocate()失敗');
}

//キャンバスに色を塗る http://jp2.php.net/imageFill
$startX = 0;
$startY = 0;
if (!imageFill($img, $startX, $startY, $bgColor)) {
throw new Exception('imageFill()失敗');
}

//文字を書く http://jp2.php.net/imageTtfText
$startX = $padSize;
$startY = $boxHeight + $padSize; //左下の座標を指定する
if (!imageTtfText($img, $fontSize, $angle, $startX, $startY, $textColor, $fontPath, $string)) {
throw new Exception('imageChar()失敗');
}

//出力(第2引数にファイルパスを渡すとファイルに保存する)
$type = 'gif';
header('Content-type: image/' . $type);
switch ($type) {
case 'gif': // http://jp2.php.net/imageGif
$result = imageGif($img);
break;
case 'jpeg': // http://jp2.php.net/imageJpeg
$quality = 100; //0~100。大きいほど高品質。デフォルトは75
$result = imageJpeg($img, null, $quality);
break;
case 'png': // http://jp2.php.net/imagePng
$quality = 0; //0~9。小さいほど高品質
$result = imagePng($img, null, $quality);
break;
}
if (!$result) {
throw new Exception('出力失敗');
}
} catch (Exception $e) {
header('Content-type: text/html');
echo $e->getMessage();
}

//後始末 http://jp2.php.net/imageDestroy
if ($img && !imageDestroy($img)) {
throw new Exception('imageDestroy()失敗');
}

2009年3月5日木曜日

PHPで文字列の中から特定の文字列を探す関数の比較

PHP5での実行例。


検索対象の文字列と探したい文字列

$src = 'Sweet Apples, Pineapples and Green apples are.';
$search = 'apple';


/*** 位置を探す ***/
strrpos()はPHP4では$searchの最初の1文字のみが対象らしい。
//前から探す
var_dump(strpos($src, $search)); // -> 18
//前から探す(大文字小文字の区別なし)
var_dump(stripos($src, $search)); // -> 6
//後ろから探す
var_dump(strrpos($src, $search)); // -> 35
//後ろから探す(大文字小文字の区別なし)
var_dump(strripos($src, $search)); // -> 35


/*** それ以降の文字列を取得する ***/
strrchr()は、$searchの最初の1文字のみが対象なので注意。
strrichr()は無いようだ
//前から探す
var_dump(strstr($src, $search)); // -> 'apples and Green apples are.'
//前から探す(大文字小文字の区別なし)
var_dump(stristr($src, $search)); // -> 'Apples, Pineapples and Green apples are.'
//後ろから探す
var_dump(strrchr($src, $search)); // -> 'are.'


/*** マルチバイト対応の関数で探す ***/
文字列がマルチバイトの場合にはこちらで
//前から探す
var_dump(mb_strpos($src, $search)); // -> 18
//前から探す(大文字小文字の区別なし)
var_dump(mb_stripos($src, $search)); // -> 6
//後ろから探す
var_dump(mb_strrpos($src, $search)); // -> 35
//後ろから探す(大文字小文字の区別なし)
var_dump(mb_strripos($src, $search)); // -> 35


/*** マルチバイト対応の関数で、それ以降の文字列を取得する ***/
文字列がマルチバイトの場合にはこちらで
//前から探す
var_dump(mb_strstr($src, $search)); // -> 'apples and Green apples are.'
//前から探す(大文字小文字の区別なし)
var_dump(mb_stristr($src, $search)); // -> 'Apples, Pineapples and Green apples are.'
//後ろから探す
var_dump(mb_strrchr($src, $search)); // -> 'apples are.'
//前から探す(大文字小文字の区別なし)
var_dump(mb_strrichr($src, $search)); // -> 'apples are.'


/*** 正規表現(Perl互換)で探す ***/
戻り値はヒットした数
//最初の1つを探す
$rtn = preg_match('/' . $search . '/', $src, $matches);
var_dump($rtn); // -> 1
var_dump($matches); // -> array('apple')
//全て探す
$rtn = preg_match_all('/' . $search . '/', $src, $matches);
var_dump($rtn); // -> 2
var_dump($matches); // -> array('apple', 'apple')


/*** 正規表現(マルチバイト対応版)で探す ***/
3番目の引数を渡した場合、戻り値はヒットした文字列のバイト数
//最初の1つを探す
$rtn = mb_ereg($search, $src, $matches);
var_dump($rtn); // -> 5
var_dump($matches); // -> array('apple')
//最初の1つを探す(大文字小文字の区別なし)
$rtn = mb_eregi($search, $src, $matches);
var_dump($rtn); // -> 5
var_dump($matches); // -> array('Apple')
//先頭から一致するか調べる
var_dump(mb_ereg_match('.*' . $search, $src)); // -> true



参考:
PHP: String 関数 - Manual
PHP: マルチバイト文字列 関数 - Manual
PHP: PCRE 関数 - Manual (Perl互換正規表現関数)

ブログ アーカイブ

tags