Skip to content

Instantly share code, notes, and snippets.

@koshiaaaaan
Created April 13, 2011 11:37
Show Gist options
  • Save koshiaaaaan/917388 to your computer and use it in GitHub Desktop.
Save koshiaaaaan/917388 to your computer and use it in GitHub Desktop.
とっても使えない PHP スニペットいろいろ。 そのうち適当に増やす。 てか、 PHP5 だけでいいような気がするので、多分次更新することがあれば PHP4 は消す。 動作環境は詳しく調べてないけど、 PHP 4.0.6 以上、 PHP 5.0.2 以上なら動くんじゃないかな? PHP4 で使うときは、 PHP5 の処理を消すか、別ファイルから読み込むようにしないとパースエラーで怒られちゃうよ。
<?php
if (!version_compare('5.0.0', phpversion(), '<')) {
if (!function_exists('array_fill')) {
function array_fill($start_index, $num, $value) {
$result = array();
for ($i = $start_index; $i < $num + $start_index; $i++) {
$result[$i] = $value;
}
return $result;
}
}
/**
* PHP4
*/
class Snippets
{
/**
* マルチバイト文字列を特定の幅で改行する。
* 通常の wordwrap とは動作が大きく違うので、ご注意下さい。
* mb_detect_order() がちゃんと設定されているか、
* 第4引数を指定しないと動作が保証されません。
*
* @param string $str
* @param integer $width = 76
* @param string $break = "\r\n"
* @return string
*/
function mbWordwrap($str, $width = 76, $break = "\r\n", $enc = null)
{
$lines = Snippets::stringToArray($str, 0);
$return = array();
foreach ($lines as $line) {
$return[] = Snippets::mbChunkSplit($line, $width, $break, $enc);
}
return join('', $return);
}
/**
* マルチバイトを含む文字列をより小さな部分に分割する。
* マルチバイトの文字幅を2として計算しています。
* mb_detect_order() がちゃんと設定されているか、
* 第4引数を指定しないと動作が保証されません。
*
* @param string $str
* @param integer $width = 76
* @param string $break = "\r\n"
* @param string $enc = null
* @return string
*/
function mbChunkSplit($str, $width = 76, $break = "\r\n", $enc = null)
{
if ($enc === null) {
$enc = mb_detect_encoding($str, mb_detect_order(), false);
}
$return = '';
$strLength = mb_strlen($str, $enc);
for ($i = 0, $length = 0; $i < $strLength; $i++) {
$char = mb_substr($str, $i, 1, $enc);
$charWidth = (strlen($char) > 1) ? 2 : 1;
$length += $charWidth;
if ($length > $width) {
$return .= $break . $char;
$length = $charWidth;
} else {
$return .= $char;
}
}
return $return;
}
/**
* 文字列を改行で区切った配列に変換します。
* 第二引数には 2 と 4 の組み合わせをフラグとして使用出来ます。
* 2 は配列の各要素の最後に改行文字を追加しません。
* 4 は空行を読み飛ばします。
*
* @param string $str
* @param integer $flags = 0
* @return array
*/
function stringToArray($str, $flags = 0)
{
if ((2 & $flags) === 2) {
$pattern = '/(.+?)(?:\r\n|\r|\n|$)/';
} else {
$pattern = '/(.+?(?:\r\n|\r|\n|$))/';
}
preg_match_all($pattern, strval($str), $matches);
if ((4 & $flags) === 4) {
return array_merge(array_diff($matches[1], array("\r", "\n", "\r\n", "")));
}
return $matches[1];
}
/**
* 特殊文字を HTML エンティティに変換する。
* 配列が渡されたら、配列全体に適応される。
*
* @param mixed $string
* @param integer $flag = ENT_QUOTES
* @param string $charset = 'UTF-8'
* @param boolean $doubleEncode = true
* @param string $method = 'htmlentities'
* @return mixed
*/
function escape($string, $flags = ENT_QUOTES, $charset = 'UTF-8', $doubleEncode = true, $func = 'htmlentities')
{
if (is_array($string)) {
return array_map(
array('Snippets', 'escape'),
$string,
array_fill(0, count($string), $flags),
array_fill(0, count($string), $charset),
array_fill(0, count($string), $doubleEncode),
array_fill(0, count($string), $func)
);
}
$string = strval($string);
if ($doubleEncode) {
$trans_tbl = get_html_translation_table(HTML_ENTITIES, $flags);
$trans_tbl = array_flip($trans_tbl);
$string = strtr($string, $trans_tbl);
}
return $func($string, $flags, $charset);
}
}
} else {
/**
* PHP5
*/
class Snippets
{
/**
* stringToArrayメソッドのフラグ。
* STRING_IGNORE_NEW_LINES は改行コードを含めない。
* STRING_SKIP_EMPTY_LINES は改行をスキップする。
*/
const STRING_IGNORE_NEW_LINES = 2;
const STRING_SKIP_EMPTY_LINES = 4;
/**
* escapeメソッドで使用するエスケープ用関数の種類。
*/
const HTMLENTITIES = 'htmlentities';
const HTMLSPECIALCHARS = 'htmlspecialchars';
/**
* escapeメソッドで使用するエスケープ用関数。
*/
public static $escapeFunction = self::HTMLENTITIES;
/**
* マルチバイト文字列を特定の幅で改行する。
* 通常の wordwrap とは動作が大きく違うので、ご注意下さい。
* mb_detect_order() がちゃんと設定されているか、
* 第4引数を指定しないと動作が保証されません。
*
* @param string $str
* @param integer $width = 76
* @param string $break = "\r\n"
* @return string
*/
public static function mbWordwrap($str, $width = 76, $break = "\r\n", $enc = null)
{
$lines = self::stringToArray($str, 0);
$return = array();
foreach ($lines as $line) {
$return[] = self::mbChunkSplit($line, $width, $break, $enc);
}
return join('', $return);
}
/**
* マルチバイトを含む文字列をより小さな部分に分割する。
* マルチバイトの文字幅を2として計算しています。
* mb_detect_order() がちゃんと設定されているか、
* 第4引数を指定しないと動作が保証されません。
*
* @param string $str
* @param integer $width = 76
* @param string $break = "\r\n"
* @param string $enc = null
* @return string
*/
public static function mbChunkSplit($str, $width = 76, $break = "\r\n", $enc = null)
{
if ($enc === null) {
$enc = mb_detect_encoding($str, mb_detect_order(), false);
}
$return = '';
$strLength = mb_strlen($str, $enc);
for ($i = 0, $length = 0; $i < $strLength; $i++) {
$char = mb_substr($str, $i, 1, $enc);
$charWidth = (strlen($char) > 1) ? 2 : 1;
$length += $charWidth;
if ($length > $width) {
$return .= $break . $char;
$length = $charWidth;
} else {
$return .= $char;
}
}
return $return;
}
/**
* 文字列を改行で区切った配列に変換します。
* 第二引数には 2 と 4 の組み合わせをフラグとして使用出来ます。
* 2 は配列の各要素の最後に改行文字を追加しません。
* 4 は空行を読み飛ばします。
*
* @param string $str
* @param integer $flags = 0
* @return array
*/
public static function stringToArray($str, $flags = 0)
{
if ((self::STRING_IGNORE_NEW_LINES & $flags) === self::STRING_IGNORE_NEW_LINES) {
$pattern = '/(.+?)(?:\r\n|\r|\n|$)/';
} else {
$pattern = '/(.+?(?:\r\n|\r|\n|$))/';
}
preg_match_all($pattern, strval($str), $matches);
if ((self::STRING_SKIP_EMPTY_LINES & $flags) === self::STRING_SKIP_EMPTY_LINES) {
return array_merge(array_diff($matches[1], array("\r", "\n", "\r\n", "")));
}
return $matches[1];
}
/**
* 特殊文字を HTML エンティティに変換する。
* 配列が渡されたら、配列全体に適応される。
*
* @param mixed $string
* @param integer $flag = ENT_QUOTES
* @param string $charset = 'UTF-8'
* @param boolean $doubleEncode = true
* @return mixed
*/
public static function escape($string, $flags = ENT_QUOTES, $charset = 'UTF-8', $doubleEncode = true)
{
if (is_array($string)) {
return array_map(
array(self, 'escape'),
$string,
array_fill(0, count($string), $flags),
array_fill(0, count($string), $charset),
array_fill(0, count($string), $doubleEncode)
);
}
$string = strval($string);
$func = self::$escapeFunction;
return $func($string, $flags, $charset, $doubleEncode);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment