il codice che hai postato è un pò un casino a dirla tutta...
ad esempio per contare il numero di elementi di un array si usa la funzione count()
for($i=0; $i<$special; $i++) è sbagliato
for($i=0; $i<count($special); $i++) è giusto
comunque prova ad usare questo:
codice:
$output = "[ url ]http://www.raptxt.it[ /url ]";
$find = array(
"'\[b\](.*?)\[/b\]'is",
"'\[url\](.*?)\[/url\]'i",
"'\[url=(.*?)\](.*?)\[/url\]'i"
);
$replace = array(
"\\1",
"<a href=\"\\1\">\\1</a>",
"<a href=\"\\1\">\\2</a>"
);
$risultato = preg_replace($find,$replace,$output);
più chiaro?