El que mostrás está hecho con str_replace, sustitución simple de cadenas. Esto es lo mejor para sustituciones simples, pero no tiene la flexibilidad para hacer lo que querés.
Si querés tener una etiqueta que reciba parámetros, vas a tener que usar expresiones regulares para capturar dicho parámetro.
Te recomiendo leer sobre expresiones regulares en internet, por lo pronto te comento que lo podés hacer de la siguiente manera:
Código PHP:
preg_replace('#[url=(.*)](.*)[/url]#U', '<a href="\\1">\\2</a>', $cadena_original);
Saludos.