<?php /** * StringUtil * 文字列処理関数集。 * $Id: StringUtil.inc,v 1.1 2015/10/08 11:18:56 wanggb Exp $ * @author iimuro * @access public * @package jp.aimslib2.util */ class StringUtil { /** * 全角カタカナであるかチェックする(SJIS) * 一度EUCに変換を行ってから判別します。 * @param String チェックする文字列 * @param String エンコーディング。省略時SJIS * @return boolean 文字列が全角カタカナだったばあいtrue */ public static function isFullKatakana($str, $encoding = "SJIS") { $euc = mb_convert_encoding($str, "EUC", $encoding); $str = rawurlencode($euc); if (preg_match("/^((\%A5\%[A-F][0-9A-F])|(\%A1\%BC)|(\%A1\%A6))+$/", $str)) { return true; } else { return false; } } /** * 半角カタカナであるかチェックする(SJIS) * 一度EUCに変換を行ってから判別します。 * @param String チェックする文字列 * @param String エンコーディング。省略時SJIS * @return boolean 文字列が半角カタカナだったばあいtrue */ public static function isHalfKatakana($str, $encoding = "SJIS") { $euc = mb_convert_encoding($str, "EUC", $encoding); $str = rawurlencode($euc); if (preg_match("/^((\%8E\%[A-D][0-9A-F])|(\%A5\%F[5-6]))+$/", $str)) { return true; } else { return false; } } /** * 一般的に有効なE-mailアドレスであるかチェックします。 * ""や<>等を含まない生アドレスの部分を対象とします。 * vodafoneのバカアドレスも有効とします。 * @param String チェックする文字列 * @return boolean 有効だったばあいtrue */ public static function isVaildMailAddress($address) { if (preg_match("/^[\w\/\(\)\-\.]+@[\w\-]+\.[\w\-]+/i", $address)) { return true; } else { return false; } } /** * 文字列にマジッククォートを追加します。 * @param String 文字列 * @return String エスケープされた文字列 */ public static function setMagicQuotes($string) { $encoded = rawurlencode($string); $tmp = str_replace("%5C", "%5C%5C", $encoded); $raw = rawurldecode($tmp); //ErrorLogger::doOutput("escaping", 0); $raw = str_replace("'", "\\'", $raw); $raw = str_replace("\"", "\\\"", $raw); return $raw; //return rawurldecode($tmp); } /** * fgetcsvの代わりに使います。 * @param String $data csvのデータ全部 * @param String $delim 区切り * @param String $enclosure 囲い文字 * @return array データを区切った配列 */ public static function fgetEscapedCsv(&$data, $delim = ',',$enclosure = '"') { $enclosed = false; $fldcount = 0; $linecount = 0; $fldval = ''; for($i=0; $i<strlen($data); $i++) { $chr = $data{$i}; if ($chr == $enclosure) { if($enclosed && $data{$i + 1} == $enclosure) { $fldval .= $chr; ++$i; //skip next char } else { $enclosed=!$enclosed; } continue; } if ($chr == $delim) { if(!$enclosed) { $ret_array[$linecount][$fldcount++] = $fldval; $fldval=''; } else { $fldval .= $chr; } continue; } if ($chr == "\r") { if(!$enclosed && $data{$i + 1} == "\n") { continue; } } if ($chr == "\n") { if(!$enclosed) { $ret_array[$linecount++][$fldcount] = $fldval; $fldcount = 0; $fldval = ''; } else { $fldval .= $chr; } continue; } $fldval .= $chr; } if($fldval) { $ret_array[$linecount][$fldcount] = $fldval; } return $ret_array; } /** * 文字列にマジッククォートを追加します。 * @param String 文字列 * @return String エスケープされた文字列 */ public static function setPostgresMagicQuotes($string) { $encoded = rawurlencode($string); $tmp = str_replace("%5C", "%5C%5C", $encoded); $raw = rawurldecode($tmp); $raw = str_replace("'", "\\'", $raw); $raw = str_replace("\"", "\\\"", $raw); return $raw; } /** * 文字列にマジッククォートを追加します。 * @param String 文字列 * @return String エスケープされた文字列 */ public static function setMySQLMagicQuotes($string) { if (defined("MYSQL_USE_5C_ESCAPE") && (!MYSQL_USE_5C_ESCAPE)) { $raw = $string; $raw = SjisUtil::escapeMySQL5CwithCP932($raw); } else { $encoded = rawurlencode($string); // latin1等のDBの場合はこっち $tmp = str_replace("%5C", "%5C%5C", $encoded); $raw = rawurldecode($tmp); $raw = str_replace("'", "\\'", $raw); $raw = str_replace("\"", "\\\"", $raw); } return $raw; } /** * 文字化けしている漢字がきたら、%5Cを追加する処理 * @param String 文字列 * @return String %5Cを追加された文字列 */ public static function escapePostgresLike5C($str) { // rawurlencode("―"),rawurlencode("ソ"),rawurlencode("Ы"),rawurlencode("Ⅸ") // rawurlencode("噂"),rawurlencode("浬"),rawurlencode("欺"),rawurlencode("圭") // rawurlencode("構"),rawurlencode("蚕"),rawurlencode("十"),rawurlencode("申") // rawurlencode("曾"),rawurlencode("箪"),rawurlencode("貼"),rawurlencode("能") // rawurlencode("表"),rawurlencode("暴"),rawurlencode("予"),rawurlencode("禄") // rawurlencode("兔"),rawurlencode("喀"),rawurlencode("媾"),rawurlencode("彌") // rawurlencode("拿"),rawurlencode("杤"),rawurlencode("歃"),rawurlencode("濬") // rawurlencode("畚"),rawurlencode("秉"),rawurlencode("綵"),rawurlencode("臀") // rawurlencode("藹"),rawurlencode("觸"),rawurlencode("軆"),rawurlencode("鐔") // rawurlencode("饅"),rawurlencode("鷭"),rawurlencode("偆"),rawurlencode("砡") $search_array = array("%81%5C","%83%5C","%84%5C","%87%5C", "%89%5C","%8A%5C","%8B%5C","%8C%5C", "%8D%5C","%8E%5C","%8F%5C","%90%5C", "%91%5C","%92%5C","%93%5C","%94%5C", "%95%5C","%96%5C","%97%5C","%98%5C", "%99%5C","%9A%5C","%9B%5C","%9C%5C", "%9D%5C","%9E%5C","%9F%5C","%E0%5C", "%E1%5C","%E2%5C","%E3%5C","%E4%5C", "%E5%5C","%E6%5C","%E7%5C","%E8%5C", "%E9%5C","%EA%5C","%FA%78","%FB%78" ); $replace_array = array("%81%5C%5C","%83%5C%5C","%84%5C%5C","%87%5C%5C", "%89%5C%5C","%8A%5C%5C","%8B%5C%5C","%8C%5C%5C", "%8D%5C%5C","%8E%5C%5C","%8F%5C%5C","%90%5C%5C", "%91%5C%5C","%92%5C%5C","%93%5C%5C","%94%5C%5C", "%95%5C%5C","%96%5C%5C","%97%5C%5C","%98%5C%5C", "%99%5C%5C","%9A%5C%5C","%9B%5C%5C","%9C%5C%5C", "%9D%5C%5C","%9E%5C%5C","%9F%5C%5C","%E0%5C%5C", "%E1%5C%5C","%E2%5C%5C","%E3%5C%5C","%E4%5C%5C", "%E5%5C%5C","%E6%5C%5C","%E7%5C%5C","%E8%5C%5C", "%E9%5C%5C","%EA%5C%5C","%FA%78%5C","%FB%78%5C" ); $encoded = rawurlencode($str); $tmp = str_replace($search_array, $replace_array, $encoded); $raw = rawurldecode($tmp); return $raw; } /** * ファイルの仕分けスクリプト用関数 * 3215_THUMBNAIL_GIF.gif => 3/3215_THUMBNAIL_GIF.gif * 3_docomo3gp_yo.3gp => 3/3_docomo3gp_yo.3gp * abc.gif => a/abc.gif */ public static function splitDirectory ($string) { if (defined("USE_DIRECTORY_SPLIT") && USE_DIRECTORY_SPLIT) { if (preg_match("/[\/]?(\w)([^\/]*)$/", $string, $tmp)) { return str_replace($tmp[1] . $tmp[2], strtolower($tmp[1]) . "/" . $tmp[1] . $tmp[2], $string); } } return $string; } // エンコード関数 // $srCode には、'SJIS', 'UTF8', 'EUC', 'ISO-2022-JP' など文字コードを指定 function doEncodeQuotedPrintable(&$str, $toCode, $fromCode, $is_force_builtin = false) { // 利用した関数名 $strFuncName = ''; if($is_force_builtin) { // 強制的にPHPビルトイン関数を無効化する $str = StringUtil::privateEncodeQuotedPrintable(mb_convert_encoding($str, $toCode, $fromCode)); } else if(function_exists('quoted_printable_encode')) { $str = quoted_printable_encode(mb_convert_encoding($str, $toCode, $fromCode)); } else if(function_exists('imap_8bit')) { $str = imap_8bit(mb_convert_encoding($str, $toCode, $fromCode)); } else { $arrEncodeSupport = mb_list_encodings(); if(array_search('Quoted-Printable', $arrEncodeSupport) != FALSE) { $str = mb_convert_encoding(mb_convert_encoding($str, $toCode, $fromCode), 'Quoted-Printable', $toCode); } else { $str = StringUtil::privateEncodeQuotedPrintable(mb_convert_encoding($str, $toCode, $fromCode)); } } return; } // エンコード関数(PHPの関数を使わないバージョン) function privateEncodeQuotedPrintable($str) { $crlf = "\r\n"; $str = trim($str); $lines = preg_split("/(\r\n|\n|\r)/s", $str); $out = ''; $temp = ''; foreach ($lines as $line) { for ($j = 0; $j < strlen($line); $j++) { $char = substr ( $line, $j, 1 ); $ascii = ord ( $char ); if ( $ascii < 32 || $ascii == 61 || $ascii > 126 ) { $char = '=' . strtoupper ( dechex( $ascii ) ); } if ((strlen ( $temp ) + strlen ( $char ) ) >= 76 ) { $out .= $temp . '=' . $crlf; $temp = ''; } $temp .= $char; } } $out .= $temp; return trim ( $out ); } } ?>