farklı bi yoldan yaptım.

burada problem çıkaran şey parantezler idi.
parantez içini parçalamayan bir fonksiyon yazdım.

önce tüm noktalı virgülleri virgüle çeviriyoruz.
sonra aşağıdaki fonksiyonu uyguluyoruz.

function my_exp($str, $sign) {
	$i = 0;
	$p = 0;
	$k = 0;
	$str = $str . $sign;
	$array = array();
	$len = mb_strlen($str,'UTF-8');
	while ($i < $len) {
		if (mb_substr($str,$i,1,'UTF-8') == '(') $p = 1;
		else if (mb_substr($str,$i,1,'UTF-8') == ')') $p = 0;
		else if (mb_substr($str,$i,1,'UTF-8') == $sign && $p == 0) {
			$new = trim(mb_substr($str,$k,$i-$k,'UTF-8'));
			$k = $i+1;
			if ($new) $array[] = $new;
		}
		$i++;
	}
	return $array;
}

$str = 'ali, veli (49, 50, abc); hepsi, deli; meli';
$str = str_replace(';',',',$str);
print_r(my_exp($str, ','));
işine yarayan kullansın.