Originariamente inviato da Manuel.s
non è che non mi piace, è che non tiene conto di accentate, utf-8, ecc...
grazie comunque per l'aiuto
uhm, hai ragione, beh in questo caso, se non usi UTF8 sul DB ti consiglio di lanciare un str_replace che converta tutte le lettere accentate nella controparte non accentata ... se le hai in utf8 prima lanci utf8_decode e poi fai la stessa operazione
@Luke70
la tua soluzione è interessante, ma fai non poche operazioni 
considera che ad esempio cambiando questa
preg_replace('/[^a-zA-Z0-9 -]/', '', $url);
con questa
preg_replace('/[^a-zA-Z0-9]+/', '-', $url);
risolvi il problema della seconda preg_replace per togliere gli spazi ed i separatori ripetuti
inoltre iconv, benché in questo caso faciliti enormemente il lavoro ed è sicuramente presente nel sistema dato che di default le librerie C posix forniscono il supporto a iconv e l'estensione è abilitata di default, ed inoltre converte le lettere accentate e non anche per le altre lingue, è più lenta.
Se, come in questo caso, i contenuti sono in italiano direi che scomodare le iconv è eccessivo 
Un semplce strtr o str_replace, in questo contesto, ci da lo stesso risultato con molto meno lavoro da parte del server.
In realtà, in un contesto del genere, visto che gli indirizzi vengono generati quando si salva l'articolo/news/blog/prodotto la performance non è così importante ... però se c'è la possibilità di avere una versione "veloce", perché non averla? 
codice:
$replace_characters = array
(
'à' => 'a',
'è' => 'e',
'ù' => 'u',
'ò' => 'o',
'ì' => 'i',
'À' => 'a',
'È' => 'e',
'Ì' => 'u',
'Ò' => 'o',
'Ù' => 'i'
)
$uri = strtr($titolo, $replace_character);
$uri = strtolower(preg_replace('/[^A-Za-z0-9']+/', '-', $uri));
nel caso di UTF8, basta lanciare al posto di
$uri = strtr($titolo, $replace_character);
questa riga qui
$uri = strtr(utf8_decode($titolo), $replace_character);