Man könnte auch die Zeichenklasse erweitern wenn das ? nicht enthalten ist:
Code:
$line= preg_replace("/\[
url=([._\-\?\+#]*)\]/Usi", "<a href=\"\\2\">", $line);
Was der . schon alles abdeckt habe ich leider grad nicht im Kopf, aber so ungefähr sollte es gehen