(Did you know your URL in your code doesn't start with [url]http://,[/url] so your pattern won't match it?)
Anyway, here's what I came up with for your problem:
$from="/\[url=(\"|')?(.+)\\1\](.*)\[\/url\]/Ui";
$to="<a href=\"\\2\">\\3</a>";
$parse=preg_replace($from, $to, $text);
The first quote is referenced in the pattern, so it'll match URLs that are contained either in a complete pair of quotes, or none either side, for uniformity. There's no protocol checking (http, ftp, whatever). It's also ungreedy, which is good, as if you have two URL tags on one line, it could get interesting :-P
did that help?