La sintassi delle posix non la ricordo, con le PCRE basta costruire la regex racchiudendo ogni parola tra \b-parola-\b. Non specificandoli la reg exp ti sostituisce tutte le occorrenze, a prescindere che siano all'interno di una parola o meno. Una cosa tipo:
codice:
$censor_word ='sōla, pippa, schiappa';

// sostiuisce il separatore virgola ed eventuali spazi 
// con l'operatore OR
$wRex = preg_replace('/\s*,\s*/','|',trim($censor_word));

// racchiude tra le \b 
$wRex = '/\b('.$wRex.')\b/i';


echo preg_replace($wRex,"**cens**",$mess_body);
Volendo provare a beccare anche se raddoppiano alcune lettere tipo le iniziali, le finali o le doppie ( una cosa tipo:
'sei una sssssssschiapppppppppaaaaaaaaaaa',
si potrebbe costruire la regexp cosė:
codice:
$censor_word ='sōla, pippa, schiappa';

$wRex = preg_replace('/\s*,\s*/','|',trim($censor_word));
$wRex = preg_replace('/(\b\w|\w\b|\B(\w)\\2+\B)/','$1+',$wRex);
$wRex = '/\b('.$wRex.')\b/i';
La sintassi \b indica l'inizio (se posto all'nizio) o la fine di una parola. Quindi \b-parola-\b cerca la parola esatta, mentre ad esempio se tu cercassi /\bporc\w+/i cercherebbe tutte le parole che cominciano con "porc" come porcozio, porcaloca, etc