Quando all’utente si lascia la possibilità di commentare articoli, di recensire prodotti o di scrivere le proprie opinioni, può essere utile far uso di una funzione che censuri una serie di parole ritenute “scomode” o “di spam”.
Con la funzione che andiamo a vedere, basta creare un array di parole: lo script si occuperà di rintracciarle nel testo e di sostituirle con un’altra parola data.
Se la parola di sostituzione non è stata passata, le stringhe da “eliminare” saranno semplicemente censurate da una serie di cancelletti (“#”).
Lo script, completo di esempio, è liberamente scaricabile dal link qui sotto.
Non necessita di modifiche, a meno che non la vogliate integrare con ulteriori controlli sui parametri (che per semplicità ho ridotto al minimo).
La funzione di sostituzione stringa
La funzione permette il passaggio di due parametri e di un terzo opzionale.
$string è il testo da analizzare, dove presumibilmente potrebbero trovarsi le parole da censurare.
$bad_words è l’ array contenente le stringhe da convertire.
$new_string è la stringa con cui le parole da censurare saranno convertite. E’ un parametro opzionale: se non passato, le stringhe di $bad_words saranno semplicemente oscurate con # (uno per carattere).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
function replace_words( $string = '', $bad_words, $new_string = '' ){ //controllo di sicurezza: $bad_words deve essere un array if(!is_array($bad_words)){ return $string; } $string = ' '.$string.' '; //delimitatori per caratteri non Unicode $delimiter = '[-_\'\"`(){}<>\[\]|!?@#%&,.:;^~*+=\/ 0-9\n\r\t]'; foreach($bad_words as $value){ //stringhe sostituite da un'altra stringa if($new_string != ''){ $string = preg_replace("/({$delimiter})(".str_replace('\*', '\w*?', preg_quote($value, '/')).")({$delimiter})/i", "\\1{$new_string}\\3", $string); //caratteri sostituiti con # }else{ $string = preg_replace("/({$delimiter})(".str_replace('\*', '\w*?', preg_quote($value, '/')).")({$delimiter})/ie", "'\\1'.str_repeat('#', strlen('\\2')).'\\3'", $string); } } return trim($string); } |
Esempio d’uso
Di seguito prendiamo come esempio un testo generico, un array di due parole da censurare e una breve stringa con cui sostituire le parole:
1 2 3 |
$text = "Qualunque bug sufficientemente avanzato è indistinguibile da una caratteristica del software."; $no_words = array('sufficientemente', 'indistinguibile'); $string = ' [eliminata] '; |
Ogni occorrenza di «sufficientemente» e di «indistinguibile» sarà sostituira con « [eliminata] » (notare spazi laterali compresi).
I risultati saranno i seguenti:
1 2 3 4 5 |
// " Qualunque bug [eliminata] avanzato è [eliminata] da una caratteristica del software. " echo replace_words($text, $no_words, $string); // " Qualunque bug ################ avanzato è ############### da una caratteristica del software. " echo replace_words($text, $no_words); |