Dovendo mostrare all'utente finale i risultati di elaborazioni effettuate, eventulamente partendo da dati inseriti dallo stesso, risulta fondamentale sapere come gestire, modificare, validare i contenuti intesi come stringhe di caratteri.
Vediamo quindi quali sono le funzioni più utilizzate in tale ambito, partendo da quelle che ci permettono di inviare
banalmente l'output al client:
echo()
forse la prima istruzione che si impara, in effetti non è neanche definita come una vera e proria funzione
quanto come un costrutto del linguaggio, questo significa che le parentesi possono anche essere omesse, in questo caso
è possibile addirittura omettere il comando utilizzando una sintassi ridotta:
<?=$variabile?>
Altra funzione di stampa è
print()
anche in questo caso è possibile omettere le parentesi, come in
print "cuccuruccucu";
l'unica differenza rispetto alla echo
è che print
ritorna un valore che può essere testato per
verificare l'effettiva stampa della stringa così da potere inserirla in espressioni condizionali complesse.
Più potenti, e complesse, le funzioni
printf($formato, $argomenti)
, sprintf($formato, $argomenti)
che permettono di inserire all'interno della stringa $formato dei posizionatori tipizzati che verranno sostituiti dagli
argomenti presenti nella chiamata alla funzione.
Ad esempio
printf("Gentile cliente %s hai %u prodotti nel carrello", $cognome, $num_prod);
produrrà qualcosa del tipo
Gentile cliente Rossi hai 3 prodotti nel carrello"
La funzione sprintf()
si differenzia solamente per il fatto che essa ritorna una stringa invece che
stamparla direttamente,il codice seguente ha lo stesso effetto dell'esempio precedente:
$stringa = sprintf("Gentile cliente %s hai %u prodotti nel carrello", $cognome, $num_prod);
echo stringa;
Anche se i problemi di spazio disco non sono più attuali spesso può essere necessario depurare una stringa (in specila modo
quelle inserite da un utente della nostra applicazione) da caratteri non necessari all'inizio o alla fine della stessa,
come ad esempio caratteri di blank.
I caratteri blank in PHP sono definiti essere le stringhe
- " " il classico spazio (ASC 32)
- "\t" il carattere di tabulazione (ASC 9)
- "\n" il carattere che definisice una nuova linea: line feed (ASC 10)
- "\r" l'a capo o meglio il carriage return (ASC 13)
- "\0" null cioè ASC 0
- "\x0B" la tabulazione verticale ASC 11
Le funzioni che puliscono le stringhe sono quelle della "famiglia" trim:
trim($stringa, $elenco_caratteri)
dove $elenco_caratteri
è opzionale è può contenere gli ulteriori caratteri che si vogliono eliminare,
rimuove i caratteri non voluti all'inizio e alla fine della stringa.
ltrim($stringa, $elenco_caratteri)
left trim, in questo caso i caratteri verranno eliminati solo all'inizio della stringa
rtrim($stringa, $elenco_caratteri)
right trim, in questo caso invece i caratteri verranno eliminati solo alla fine della stringa
Ora che la nostra stringa contiene solo quello che vogliamo, potrebbe essere necessario fare in modo che i caratteri
speciali contenuti all'interno vengano gestiti da un escape. Per escape si intende la modifica di un carattere
perchè esso perda un suo significato particolare legato all'ambito applicativo e venga interpretato invece esattamente come
carattere, un esempio classico è quello degli slash.
PHP mette a disposizione la funzione
addslashes($stringa)
che restituisce $stringa avendo cura che ogni carattere che potrebbe recare problemi (ad esempio nell'esecuzione di $stringa
come una query su database) venga correttamente gestito anteponendovi un backslash.
I caratteri che verranno "escappati" sono
- l'apice '
- il doppio apice "
- backslash stesso \
- e il byte vuoto NUL
Per riportare la stringa al formato originale, facendo in modo cioè che sequenze del tipo "\\" ritornino ad essere "\",
si può utilizzare
stripslashes($stringa)
Questa risulta utile quando non si debba utilizzare la stringa "escappata" in un database ma, ad esempio,
la si voglia mostrare in output all'utente.
Una ulteriore accortezza è la codifica/decodifica dei caratteri speciali in entità HTML. Per entità HTML si intendono
quelle sequenze di caratteri preceduti da & che vengono utilizzati per indicare ai browser di visualizzare il
carattere speciale, alcuni esempi sono
"
&
€
La funzione
htmlentities($stringa)
converte automaticamente tutti i caratteri per i quali esiste una codifica HTML, mentre
htmlspecialchars($stringa)
converte solamente i caratteri &, ", ', < e >
La conversione opposta viene effettuata dalla funzione
html_entity_decode($stringa)
Passiamo ora ad analizzare le funzioni che ci permettono di operare sul contenuto della stringa per estarne dei sottoinsiemi di caratteri (sotto-stringhe)
o per verificare che all'interno della stringa appaiano particolari caratteri. Queste funzioni sono spesso usate in costrutti condizionali per effetuare
operazioni solo sulle stringhe che soddisfano particolari condizioni.
substr($stringa, $inizio, $lunghezza)
questa funzione ci permette, specificando oppurtanamente i parametri $inizio e $lunghezza (quest'ultimo non obbligatorio),
di estrapolare dalla stringa iniziale delle sequenze di caratteri, la cosa interessante è che oltre all'utilizzo intuitivo:
$stringa = "abcdefghilmnopqrstuvz";
print substr($stringa, 5);
che produrrà
fghilmnopqrstuvz
restituendo i caratteri a partire dal sesto fino al termine della stringa
oppure
print substr($stringa, 0, 10);
che produrrà
abcdefghil
estraendo i primi 10 caratteri a partire dal primo (si noti come, così come per gli array il primo carattere ha indice 0)
è anche possibile inserire numeri negativi come parametri, infatti nel caso l'indice di partenza sia negativo i caratteri verranno
presi a partire dal fondo della stringa, ad esempio
print substr($stringa, -5);
produce l'output
stuvz
tornando cioè gli ultimi cinque caratteri.
Nel caso sia negativo il parametro che indica la lunghezza il numero di caratteri ritornati sarà uguale al numero di caratteri
da $inizio alla fine della stringa meno il valore negativo di $lunghezza, vediamo degli esempi:
print substr($stringa, 0, -5);
torna
abcdefghilmnopqr
cioè i caratteri dalla prima pozione fino al sestultimo, mentre
print substr($stringa, 5, -5);
torna
fghilmnopqr
quindi dal sesto al sestultimo,
print substr($stringa, -5, -3);
produce
st
cioè a partire dal quint'ultimo carattere prendo i caratteri fino al terz'ultimo, si noti come (ovviamente) chiamate del tipo
print substr($stringa, -n, -n);
dove n è un intero producano sempre una stringa vuota.
Una funzione basata sugli stessi concetti di substr() è
substr_replace($stringa, $nuova, $inizio, $lunghezza)
che inserisce al posto della sottostringa individuata da $inizio e $lunghezza la stringa $nuovo,
così
print substr_replace($stringa, 'STUVZ', -5);
produce l'output
abcdefghilmnopqrSTUVZ
e invece
print substr_replace($stringa, 'ST', -5, -3);
produce l'output
abcdefghilmnopqrSTuvz
Un'altra possibilità per la redifinizione di una stringa è data da
str_replace($trova, $sostituisci, $stringa)
che sostituisce all'interno di $stringa tutte le occorrenze di $trova con $sostituisci,
ad esempio
$stringa="alfabeto alfanumerico";
print str_replace("alfa", "ALFA", $stringa);
ci mostra
ALFAbeto ALFAnumerico
attenzione che il match della sottostringa sarà case-sensitive cioè
$stringa="Alfabeto alfanumerico";
print str_replace("alfa", "AlFA", $stringa);
produrrà
Alfabeto AlFAnumerico
Solo dalla versione 5 di PHP è stato introdotta la funzione
stri_replace($trova, $sostituisci, $stringa)
che effettua un math case insensitive.
strpos($stringa, $cerca)
ritorna la posizione all'interno di $stringa del carattere o sottostringa $cerca oppure FALSE se
la sottostringa non è presente:
$stringa="Alfabeto alfanumerico";
print strpos($stringa, "fa");
ci mostra
2
indicandoci che la prima occorrenza di "fa" parte dal terzo carattere di $stringa.
Un problema comune si ha quando si utilizza questa funzione per verificare la presenza o meno della sottostringa,
infatti impostando il costrutto condizionale in questo modo
if (!strpos($stringa, "Al"))
print "Al (sembra) non esserci...";
incappiamo nel fatto che il PHP valuta la condizione !strpos($stringa, "Al")
come FALSE dato che essa
vale 0 essendo che la stringa Al parte dall'indice 0 della stringa...
Per ovviare a questo problema si può utilizzare l'operatore di confronto ===
che indica un'uguaglianza non solo
nel valore ma anche nel tipo delle due variabili confrontate, il costrutto "giusto" sarà del tipo
if (strpos($stringa, "Al")===FALSE)
print "Al non c'è";
else
print "Al c'è";
Se ci interessa trovare invece l'indice dell'ultima occorrenza della sottostringa possiamo usare la funzione
right strpos:
strrpos($stringa, $cerca)
utilizzando l'esempio precedente
$stringa="Alfabeto alfanumerico";
print strrpos($stringa, "fa");
vediamo come il risultato sia diverso
11
Abbiamo visto come le stringhe in PHP siano molto vicine al concetto di array, è infatti possibile immaginare una stringa
come un array di caratteri indicizzati a partire da 0, possiamo infatti accedere al singolo carattere con modalità del tipo
$stringa = "abcdefghilmnopqrstuvz";
print $stringa{12};
che stampa il tredicesimo carattere di $stringa
o
Questa "vicinanza" tra stringhe ed array può essere ancora meglio compresa analizzando le funzioni che si occupano proprio
di permettere il passaggio tra una struttura "stringa" ad un "array" e l'inverso.
Partiamo da
explode($separatore, $stringa)
che ritorna un array con, in ogni elemento, la sottostringa ottenuta suddividendo $stringa in base al carattere o
sottostringa $separatore.
Vediamo un esempio
$stringa = "Mario Rossi studente";
$array = explode(" ", $stringa);
print "Nome: ".$array[0]."\n<br>";
print "Cognome: ".$array[1]."\n<br>";
print "Occupazione: ".$array[2]."\n<br>";
produce come output
Nome: Mario<br>
Cognome: Rossi<br>
Occupazione: studente<br>
Un utilizzo classico di questa funzione è il parsing di file di tipo CSV (Comma Separated Value) cioè di file che
contengono un record per riga, i campi del record sono separati da un carattere predefinito.
Si presti attenzione ai casi particolari in cui
- $separatore non sia presente all'interno di $stringa: il risultato della funzione sarà un array che contiene $stringa
- $separatore è una stringa vuota, in tal caso explode() ritorna il valore FALSE
L'operazione inversa, cioè partire da un array per ottenere una stringa è possibile con
implode($separatore, $array)
che genera la stringa unendo i vari elementi di $array con $separatore, così
$array = array("nome" => "Mario", "cognome" => "Rossi", "occupazione" => "studente");
$stringa = implode(",", $array);
print $stringa;
genera un riga che potremmo inserire in un file CSV:
Mario,Rossi,studente
E' anche possibile effettuare un suddivisione della stringa basandosi su un espressione regolae, la funzione che ce lo permette è
split($espressione, $stringa)
Questo può essere utile ad esempio quando la stringa sia inserita da un utente che può quindi utilizzare diversi separatori convenzionali, classico esempio
è quello dl reperimento del prefisso e del numero di telefono ad esempio:
$telefono1 = "335 12345678";
$telefono2 = "335-12345678";
$array1 = split ("[ -], $telefono1);
$array2 = split ("[ -], $telefono2);
print_r ($array1);
print_r ($array2);
Si noti come l'utilizzo di split() sia consigliato solo quando sia effettivamente necessario utilizzare espressioni regolari.
Riferimenti, esempi e teoria sulle funzioni che PHP fornisce
manipolazione stringhe
vorrei sapere come fare per contare le occorrenze di ciascun carattere nella stringa.