замена fgetcsv

Profic

just Profic (PHP5 BetaTeam)
замена fgetcsv

PHP:
<?php
//$csv_str = '"aaa";"B""BB";"CC\"";""C";"123";"""ddd""";"""""";"";"eee";10.00;"--";;;0.00'; 
$csv_str  = '22;11792;"=ph(""Студенты""); $habitur=ph(""";Абитуриенты;Абитуриенты;"""); $hgrad=ph(""Выпускники""); $";;/abitur.php4';

define ('SEPAR', ';');
define ('Q', '"');

preg_match_all (
	  '~('.Q.'[^'.Q.']*?('.Q.Q.'[^'.Q.']*?)*?'.Q.'|[^'.SEPAR.']*?)('.SEPAR.'|$)~si'
	, $csv_str
	, $arr
);
if (empty ($arr[3][($last = sizeof ($arr[3]) - 1) - 1])) {
	unset ($arr[1][$last]);
}
$arr = $arr[1];

print_r ($arr);

?>
 

Profic

just Profic (PHP5 BetaTeam)
По предложению Димы написал генерилку случайных строк. Также ещё немного сократил регулярку %)
PHP:
error_reporting (E_ALL);

define ('SEPAR', ';');
define ('Q', '"');

function myfgetcsv ($csvStr) {
	//echo $csvStr."\n";
	preg_match_all (
		  '~('.Q.'((?:'.Q.Q.')?[^'.Q.']*?)*?'.Q.'|[^'.SEPAR.']*?)('.SEPAR.'|$)~si'
		, $csvStr
		, $arr
	);
	if (empty ($arr[3][($last = sizeof ($arr[3]) - 1) - 1])) {
		unset ($arr[1][$last]);
	}
	$arr = $arr[1];
	for ($i = 0; $i < $last; $i++) {
		if (strlen ($arr[$i]) && $arr[$i]{0} == Q) {
			$arr[$i] = str_replace (Q.Q, Q, substr ($arr[$i], 1, -1));
		}
	}
	return $arr;
}

function seedRand () {
	list ($usec, $sec) = explode (' ', microtime ());
	mt_srand ((float) $sec + ((float) $usec * 100000));
}

function strGet ($length) {
	$retVal = '';
	for ($i = 0; $i < $length; $i++) {
		$retVal .= chr (mt_rand (0, 255));
	}
	return $retVal;
}

function strEscape ($str) {
	return preg_replace ('~([\x00-\x1f])~e', '\'&#\' . ord (\'\1\') . \';\'', $str);
}

seedRand ();
$result = array ();

for ($i = 0; $i < 1000; $i++) {
	$csvInput = array ();
	$csvInput[] = Q . str_replace (Q, Q . Q, strGet (mt_rand (10, 50))) . Q;
	$csvInput[] = Q . str_replace (Q, Q . Q, strGet (mt_rand (10, 50))) . Q;
	$csvInput[] = Q . str_replace (Q, Q . Q, strGet (mt_rand (10, 50))) . Q;
	$csvInput[] = mt_rand (0, 1000);
	$csvInput[] = mt_rand (0, 1000);
	$csvInput[] = mt_rand () / 1000000;
	if (mt_rand (0, 1)) {
		$csvInput[] = '';
	}
	if (mt_rand (0, 1)) {
		$csvInput[] = '';
	}
	$csvStrInput = join (SEPAR, $csvInput);
	$csvOutput = myfgetcsv ($csvStrInput);
	$csvOutput[0] = Q . str_replace (Q, Q . Q, $csvOutput[0]) . Q;
	$csvOutput[1] = Q . str_replace (Q, Q . Q, $csvOutput[1]) . Q;
	$csvOutput[2] = Q . str_replace (Q, Q . Q, $csvOutput[2]) . Q;
	$csvStrOutput = join (SEPAR, $csvOutput);

	if ($csvStrInput === $csvStrOutput) {
		//echo "$i ok\n";
		//echo "-> " . strEscape ($csvStrInput) . "\n";
		$result[] = 1;
	} else {
		echo "$i BAD\n";
		echo "-> " . strEscape ($csvStrInput) . "\n";
		echo "<- " . strEscape ($csvStrOutput) . "\n";
		$result[] = 0;
	}
}

if (min ($result)) {
	echo "All OK\n";
} else {
	echo "Test failed\n";
}
Результат положительный %)
 
Сверху