il primo (e il secondo) parametro di str_replace può un array:

Codice PHP:
<?php
$parole_vietate 
= array('stringa''essere''parole'); // stringhe da rimuovere

$stringa 'questa è una stringa da cui devono essere rimosse delle parole';

$new_stringa str_replace($parole_vietate''$stringa);
// se hai una versione recente di php puoi usare str_ireplace 
// che non distingue tra maiuscole e minuscole (non case sensitive)
?>
Pertanto quel ciclo di for che fai per sostituire lo ritengo errato... o quantomeno errato...

inoltre count ti restituisce il numero di elementi:
Codice PHP:
$caratteri = array("'","_","-");
$max count($caratteri); 
nel tuo caso pari a 3... ma le chiavi non partono da 1 e arrivono a 3!!!
esse partono da 0 e arrivano a due!!!!

pertanto l'ultimo ciclo di for che esegui in cui
Codice PHP:
$dw_titolo str_replace($caratteri[3]," ",$titolo); 
risulta essere errato dato che $caratteri[3] non esiste!!!

spero di esserti stato chiaro e di aiuto!

ciao