<?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 );
	}
}

?>