[PHP] fgetcsv() で値の1文字目が文字化けするバグの修正

/**
 * PHPのfgetcsv()で値の1文字目が文字化けするバグを修正
 * ファイルポインタから行を取得し、CSVフィールドを処理する
 * @param resource $handle
 * @param int $length
 * @param string $delimiter
 * @param string $enclosure
 * @return ファイルの終端に達した場合を含み、エラー時にFALSEを返す
 * http://yossy.iimp.jp/wp/?p=56
 */
function fgetcsv_reg (&$handle, $length = null, $delimiter = ',', $enclosure = '"') {
	//正規表現構文の特殊文字の前にバックスラッシュを挿入
	$delimiter = preg_quote($delimiter);
	$enclosure = preg_quote($enclosure);
	$_line = "";
	$eof = false;
	while ($eof != true) {
		$_line .= (empty($length) ? fgets($handle) : fgets($handle, $length));
		$itemcnt = preg_match_all('/'.$enclosure.'/', $_line, $dummy);
		if ($itemcnt % 2 == 0) {
			$eof = true;
		}
	}
	$_csv_line = preg_replace('/(?:\r\n|[\r\n])?$/', $delimiter, trim($_line));
	$_csv_pattern = '/('.$enclosure.'[^'.$enclosure.']*(?:'.$enclosure.$enclosure.'[^'.$enclosure.']*)*'.$enclosure.'|[^'.$delimiter.']*)'.$delimiter.'/';
	preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
	$_csv_data = $_csv_matches[1];
	for($_csv_i=0;$_csv_i<count($_csv_data);$_csv_i++){
		$_csv_data[$_csv_i]=preg_replace('/^'.$enclosure.'(.*)'.$enclosure.'$/s','$1',$_csv_data[$_csv_i]);
		$_csv_data[$_csv_i]=str_replace($enclosure.$enclosure, $enclosure, $_csv_data[$_csv_i]);
	}
	return empty($_line) ? false : $_csv_data;
}

参考URL

引用させていただきました。ありがとうございます。

こちらもあわせてどうぞ
  1. [PHP] 日付・時刻用の関数
  2. [PHP] 携帯(モバイル)用の関数
  3. [PHP] メールマガジン用の関数
  4. [PHP] 資料請求用の関数
  5. [PHP] CMS(ページ生成機能)用の関数
HatenaGoogle BookmarksYahoo BookmarksFacebook

コメントする

*