Ago 03 2007
Rimuovere caratteri “sporchi” da una stringa in PHP
Capita spesso di dover ripulire una stringa da caratteri diciamo “non standard” come lettere accentate, & commerciali, parentesi etc…
In php per farlo è sufficiente sfruttare la potentissima: ereg_replace() in combinazione con str_replace().
Di seguito ecco una funzione utile e la relativa spiegazione.
function cleanString($string)
{
$string = str_replace(”è”, “e”, $string);
$string = str_replace(”à “, “a”, $string);
$string = str_replace(”à”, “o”, $string);
$string = str_replace(”ì”, “i”, $string);
$string = str_replace(”ù”, “u”, $string);
$string = ereg_replace(”[^A-Za-z0-9 ]“, “”, $string );
return $string;
}
Alla funzione viene passata la stringa sorgente da ripulire, successivamente (per scelta) vengono sostituite le classiche lettere accentate con le corrispettive non accentate, giusto per non tagliare brutalmente pezzi di stringa.
A seguito di questo viene eseguita ereg_replace() con una semplice espressione regolare che consente di accettare solo i caratteri da A a Z (maiuscoli), a -> z (minuscoli), i numeri da 0 a 9 e gli spazi.
Infine la stringa viene ritornata ripulita.
Per utilizzare la suddetta funzione è sufficiente richiare un codice di questo tipo:
$stringa_sporca = “Ciao, il mio nome è Massimo & questo è il mio blog”;
echo cleanString($stringa_sporca);
La stringa si trasforma a video in:
“Ciao il mio nome e Massimo questo e il mio blog”
Naturalmente alla funzione si possono applicare diverse alternative di sostituzione caratteri “pre-pulizia” ed estenderla con argomenti in ingresso che definiscano differenti comportamenti a seconda del caso.
Se qualcuno volesse dilettarsi a farlo e volesse postarlo nei commenti con piacere aggiornerà il post riportando le sue modifiche.
Ciao. Maxgrante
info[AT]massimo-caselli[DOT]com
Spero tu stia scherzando!!!…il tuo articolo non ha assulutamente motivo di esistere! Senza contare che nella tua frase trasformata ci sono degli errori grammaticali…
Nella frase trasformata è naturale che vi siano errori grammaticali, era un semplice esempio atto a dimostrare la pulizia di tutto cià che non siano spazi e/o caratteri alfanumerici standard.
Tipicamente queste cose si fanno per ripulire login o pwd o ragioni sociali per inserirle in sistemi che potrebbero incazzarsi di fronte a caratteri non standard.
Unico errore, ora corretto, è che mancava nel passaggio dell’argomento a cleanString() la variabile corretta essendomi sfuggito un underscore.
Ottimizzazione del codice…
$a = array(’à ’,'è’, ‘à©’,'ì’, ‘à’, ‘ù’);
$b = array(’a',’e',’e',’i',’o',’u');
$string = str_replace($a, $b,$string);
xke’ invece di sostituire la a accentata (à ) con la a senza accent (a) nn si sostituisce con il codice html à ? e cosi’ via per le altre lettere … ciao
errata corridge, a quanto pare il campo dove scrivere i commenti fa confusione se si scrivono codici html
il codice html che volevo scrivere e’ (e commerciale)agrave;
@Yemmi
Hai ragione, normalmente basterebbe fare tipo htmlentities o specialchars, ma la funzione nasce per gestire sistemi che non vogliono nemmeno le entity HTML.
ok allora sostituire la “à ” con una “a’” cioe’ a con vigoletta dopo, xke una “a” senza niente e’ errore grammaticale grave
@yemmy
Scusa ma l’esempio che ho fatto forse era poco calzante, il punto è che questo tipo di funzioni nascono e si utilizzano tipicamente per gestire solo caratteri puliti puliti.
Esempio tipico spesso sono i gestionali di contabilità generale.
Ciao. Max
Una volta creai una funzione simile per traslitterare dei caratteri cirillici in caratteri latini.
Ho usato pero la funzione strtr, che seppur essendo meno performante della str_replace(in ordine di qualche microsecondo), ha una sintassi piu’ carina.
Quindi nel caso delle accentate italiane, si potrebbe fare una cosa del genere:
$stringa_sporca = strtr($stringa_sporca, “à èéùòì”, “aeeuoi”);
oppure:
$caratteri = array(’à ‘=>’a',’è’=>’e',’é’=>’e',’ù’=>’u',’ò’=>’o',’ì’=>’i');
$stringa_sporca = strtr($stringa_sporca, $caratteri);
Ciao.
ne ho fatta una simile anche io e a volte continuo ad utilizzarla…