Я решил проблему с этим кодом, но он еще не проверен должным образом:
preg_match('|([a-z]+)://([^:]*)(:(.*))?@([A-Za-z0-9\.-]*)(/([0-9a-zA-Z_/\.]*))|',
$dsn,$matches);
$dsn=array(
$matches[1].':host='.$matches[5].';dbname='.$matches[7],
$matches[2],
$matches[4]
);