Con PHP risulta molto semplice manipolare le stringhe, in parte per le caratteristiche del linguaggio dotato, come è noto, di una sintassi semplice, snella e compatta. In parte per la disponibilità di una vasta libreria di funzioni che permette di svolgere con facilità le più comuni come le più complesse elaborazioni.
In questo articolo si introdurranno i concetti basilari relativi alle stringhe, per poi passare ad illustrare alcune tra le numerose funzioni, soprattutto nell'ottica dello sviluppo di applicazioni web. Gli argomenti trattati si rivolgono principalmente a chi da poco si è avvicinato a PHP, malgrado ciò qualche spunto interessante potranno trovarlo anche i programmatori un po' più esperti. L'obiettivo è fornire una breve panoramica degli strumenti messi a disposizione dal linguaggio per scrivere codice efficiente ed elegante senza "reinventare l'acqua calda".
Definire le stringhe
Con il termine stringa si intende una sequenza di caratteri: "web"
, "consulta freephp.html.it"
, "PHP rende la vita facile ai programmatori"
, sono semplici esempi di stringhe. Per assegnare ad una variabile un valore di tipo stringa dobbiamo utilizzare dei delimitatori che consentano di racchiudere la sequenza di caratteri desiderata. La sintassi del linguaggio fornisce varie alternative, ciascuna con proprie particolarità.
Come primo approccio possiamo delimitare la stringa mediante virgolette doppie ("
):
<?php
$stringa = "Naviga su html.it";
// posso anche andare a capo
$stringa1 = "Naviga su html.it lo troverai interessante";
?>
Quando si adotta questa sintassi PHP analizza il contenuto della stringa alla ricerca di nomi di variabile individuati dal simbolo $; qualora ne trovi uno lo sostituisce automaticamente con il corrispondente valore. Questa caratteristica prende il nome di espansione dei nomi di variabile. Il codice seguente esemplifica quanto descritto:
<?php
$sito = "html.it";
// la variabile $stringa conterrà
// la stringa "Naviga su html.it"
$stringa = "Naviga su $sito";
// posso utilizzare anche la componente di un array
$arraysito[0]= "html.it";
$stringa1 = "Naviga su $arraysito[0]";
?>
Si osservi che l'automatismo della sostituzione necessita di alcuni accorgimenti se la variabile all'interno della stringa è un array associativo o bidimensionale:
<?php
$sito["nome"] = "html.it";
// la successiva assegnazione genererà un errore
$stringa1 = "Naviga su $sito["nome"]";
// anche questa assegnazione genererà un errore
$stringa2 = "Naviga su $sito['nome']";
// questa assegnazione funziona correttamente
$stringa3 = "Naviga su $sito[nome]";
// si può ricorrere alle parentesi graffe
// anche questa assegnazione funziona
$stringa4 = "Naviga su {$sito['nome']}";
// anche la variabile $stringa5 conterrà la stringa
// corretta "Naviga su html.it "
$stringa5 = "Naviga su " .$sito["nome"];
$sito[4][1] = "html.it";
// la variabile $stringa6 conterrà la stringa
// errata "Naviga su Array[1]"
$stringa6 = "Naviga su $sito[4][1]";
// la successiva variabile conterrà la stringa
// corretta "Naviga su html.it "
$stringa7 = "Naviga su " .$sito[4][1];
// anche la successiva variabile conterrà la stringa corretta
$stringa8 = "Naviga su {$sito[4][1]}";
?>
Come si può notare nel caso della variabile $stringa3
, la componente di un array associativo all'interno di una stringa non va specificata mediante virgolette doppie o singole.
Questo modo di procedere si contrappone alle usuali regole di buona scrittura del codice indicate nella documentazione ufficiale. In alternativa si può ricorrere all'utilizzo delle parentesi graffe ovvero alla cosiddetta sintassi complessa, come nel caso delle variabili $stringa4
e $stringa8
dell'esempio precedente. Il nome deriva non tanto dalla sua difficoltà di utilizzo, quanto dalla possibilità di inserire espressioni complesse come se si fosse all'esterno della stringa, per maggiori dettagli si rimanda alla documentazione ufficiale.
Infine nel caso delle variabili $stringa5
e $stringa7
si è fatto ricorso all'operatore di concatenazione, ovvero il punto (.
), che permette di unire più stringhe. Il successivo esempio ne rende più chiaro l'utilizzo:
<?php
$uno = "Naviga";
$due = "su";
$tre = "html.it";
// la variabile $stringa conterrà la
// stringa "Naviga su html.it "
$stringa = $uno. " " .$due. " " .$tre;
?>
Utilizzando l'operatore .= è possibile effettuare concatenazione ed assegnazione in un unica istruzione.
<?php
$stringa = "Naviga su ";
//sintassi classica
$stringa = $stringa. "html.it";
//sintassi abbreviata
$stringa .= "html.it";
?>
Se all'interno della stringa vogliamo inserire le virgolette doppie ("
), il carattere di backslash (), o il simbolo del dollaro (
$
) dobbiamo effettuarne il cosiddetto escape. Sarà necessario, cioè, far precedere tali simboli dalla backslash così: "
, ,
$
, in caso contrario potremmo ottenere un messaggio d'errore. È anche possibile inserire alcuni caratteri speciali quali linefeed (new line), n
, carriage return, r
, o tab, t
.
<?php
$stringa = "Egli disse:"Naviga su html.it!"";
$stringa1 = "Adesso vado a capo.nQui sono alla riga successiva.";
?>
In alternativa PHP prevede che le stringhe possano essere racchiuse tra virgolette singole ('
). Con questa sintassi non viene effettuata la sostituzione delle variabili con il corrispondente valore.
<?php
$sito = 'html.it';
// la variabile conterrà la stringa "Naviga su $sito"
$stringa1 = 'Naviga su $sito';
// la variabile conterrà la stringa "Naviga su html.it"
$stringa2 = 'Naviga su ' .$sito;
?>
I caratteri che in questo caso devono essere preceduti da backslash sono le virgolette singole, '
e la backslash stessa, .
<?php
// l'assegnazione seguente è corretta
$stringa1 = 'Egli disse:"L'importante è navigare su html.it"';
// non è possibile usare caratteri speciali
$stringa2 = 'Il carattere di new line n non verrà considerato, ma stampato tale e quale';
?>
heredoc
L'ultima sintassi disponibile è quella dei cosiddetti "documenti here" (heredoc). Le stringhe in questo caso sono delimitate inizialmente da tre simboli di minore seguiti da un identificatore, ad esempio <<<DH
. La chiusura si ottiene mediante il medesimo identificatore seguito da punto e virgola, DH;
.
Il principale vantaggio di questa rappresentazione è che le variabili vengono sostituite con il corrispondente valore e le virgolette doppie non necessitano di escape. Risulta molto utile, ad esempio, per stampare dei form evitando il continuo ricorso a backslash nell'inserimento di attributi dei tag HTML.
<?php
$sito = "html.it";
// la seguente variabile conterrà la stringa "Naviga su html.it"
$stringa = <<<DH
Naviga su $sito
DH;
// ecco come costruire un form
$form = <<<DH
<form method="post" action="reciver.php">
<input type="text" name="testo" value="">
<input type="submit" name="invia" value="invia">
</form>
DH;
?>
Echo e print, l'output delle strighe
Dopo aver illustrato come definire le stringhe, vediamo ora come visualizzarle. PHP prevede diverse funzioni per l'output, la principale è echo(). In realtà non è una funzione vera e propria, ma un costrutto del linguaggio e quindi possiamo omettere le parentesi tonde.
<?php
echo "Consulta il sito html.it";
// la stringa può essere suddivisa su più linee
echo "La stringa si compone
di più linee
ma verrà correttamente stampata";
// si possono inserire dei caratteri new line n all'interno della stringa
echo "La stringa contiene caratteri new linene viene stampatansu più lineencontrollate il sorgente html";
echo "La stringhe ", "possono essere più di una ";
$stringa = "stringa di prova";
echo $stringa;
echo "Ecco una $stringa";
?>
Echo
prevede una sintassi abbreviata che funziona solo se nel file di configurazione php.ini la direttiva short_open_tag è impostata su on
:
<!-- così viene stampata la variabile $stringa -->
<?=$stringa?>
La funzione print(), anch'essa prevista dal linguaggio, si può considerare praticamente equivalente ad echo
. Alcuni test hanno però dimostrato che echo
risulta più veloce del 5-10%
a seconda dei contesti. Si osservi che la sintassi di print()
non permette argomenti multipli.
<?php
$stringa = "stringa di prova";
print "Ecco una $stringa";
// così non funziona
print "La stringhe ", "non possono essere più di una ";
?>
Formattare le stringhe: printf
La funzione printf() (come l'omologa sprintf()), viene utilizzata per produrre un output formattato. È sconsigliabile in termini di prestazioni rispetto alle altre due, va quindi utilizzata solo quando sia effettivamente necessaria.
Si pensi di dover stampare il numero 1/6
: utilizzando echo
o print
si otterrebbe il risultato seguente 0.166666666667
. Per ottenere un risultato più leggibile, con due sole cifre dopo la virgola dovremo ricorrere a printf()
;
<?php
// stampiamo (1/6) come 0.17
printf("%1.2f", (1/6));
?>
In pratica il primo argomento della funzione specifica il formato con cui rappresentare il numero che compare come secondo argomento. Nell'esempio mostrato il numero da stampare dovrà essere costituito dal almeno un carattere, dovrà avere due cifre dopo la virgola e dovrà essere trattato come un numero floating-point (f
).
Forse l'utilizzo della funzione non è immediato, sinteticamente per indicare come formattare l'output si specificano nell'ordine:
- uno o più caratteri (escluso %) che precedono il risultato
- il simbolo %
- uno specificatore di padding (opzionale)
- uno specificatore di allineamento (opzionale)
- uno specificatore di numero minimo di caratteri (opzionale)
- uno specificatore di precisione (opzionale)
- uno specificatore di tipo che indica se l'argomento da stampare sia da considerarsi intero, float, stringa etc.
Per maggiori dettagli si rimanda alla documentazione ufficiale, mentre di seguito si riportano alcuni esempi significativi:
<?php
// stampiamo "valore pari a euro 30.25"
printf("valore pari a euro %2.2f", 30.25);
// stampiamo 2 come 00002
printf("%05d", 2);
// stampiamo 2 come ***2
printf("%'*4d", 2);
?>
PHP fornisce anche altre funzioni di output che, per ragioni di spazio e particolarità di utilizzo, non prenderemo in considerazione. Si descriverà più avanti la funzione number_format()
, utile per la formattazione dei numeri, che permette di evitare il ricorso alla più complessa printf()
.
Funzioni per le stringhe in applicazioni web
Terminata l'analisi dei concetti basilari, prendiamo in considerazione alcune funzioni particolarmente utili nello sviluppo di applicazioni web. In particolare per trattare i dati inseriti dagli utenti.
La regola fondamentale per chi si cimenti in questo compito è: "non fidarsi mai di ciò che proviene dal web!" In particolare dobbiamo trattare come "contaminati" tutti dati inviati dai navigatori del nostro sito, assicurandoci che il loro contenuto non possa in qualche modo danneggiare l'applicazione.
L'inserimento di tag HTML, se inviati al browser, potrebbe rovinare il layout delle nostre pagine, l'inserimento di javascript potrebbe risultare ancora più dannoso. Basti pensare ad applicazioni quali forum o guestbook per rendersi conto dei possibili rischi.
Togliere il markup HTML dalle stringhe: strip_tags
Fortunatamente viene in nostro aiuto la funzione strip_tags() che permette di eliminare i tag HTML, JavaScript e marcatori PHP indesiderati.
<?php
$stringa = "Visita <b><a href="http://www.html.it">html.it</a></b>";
// stampiamo solo la stringa "Visita html.it" eliminando i tag HTML
echo strip_tags($stringa);
?>
La funzione è abbastanza flessibile da permettere di conservare solo i tag desiderati, basterà specificarli come secondo argomento:
<?php
$stringa = "Visita <b><i><a href="http://www.html.it">html.it</a></i></b>";
// Eliminiamo tutto tranne grassetti e corsivi
// Stamperemo "<b><i>Visita html.it</i></b>" eliminando i tag <a>
echo strip_tags($stringa,"<b><i>");
?>
Eliminare gli spazi 'inutili' dalle stringhe: trim
La funzione trim() permette di rimuovere spazi bianchi, "
" (ASCII 32
), caratteri di new line, "n
" (ASCII 10
), caratteri di carriage return, "r
" (ASCII 13
), tabulazioni, "t
" (ASCII 9
), NUL "