Descrizione
preg_replace(
mixed $espressione_regolare
,
mixed $sostituto
,
mixed $testo
,
int $limite
= ?
): mixed
Il parametro sostituto
può contenere riferimenti
nella forma di \\n
, oppure,
a partire dalla versione 4.0.4 di PHP, $n
, con la preferenza per la seconda sintassi. Questo tipo di
riferimento verrà sostituito dal testo che soddisfa l'n
-esimo criterio presente in espressione_regolare
. Sono ammessi numeri compresi tra 0 e 99 inclusi. Il valore 0
(\\0
oppure $0
) si riferisce al testo
riconosciuto tramite tutta l'espressione regolare passata. Nel conteggio
dei criteri di riconoscimento presenti, sono contate le parentesi
aperte da sinistra verso destra partendo da 1.
Quando si lavora con un criterio di sostituzione in cui un riferimento all'indietro
è immediatamente seguito da un'altro numero (ad esempio un numero che segue immediatamente
il criterio riconosciuto), non si possono utilizzare le solite notazioni, \\1
,
per i riferimenti all'indietro. Ad esempio, il testo \\11
confonderebbe preg_replace() poiché non saprebbe se si desidera il riferimento
all'indietro \\1
seguito dal numero 1
, oppure
se è desiderato il riferimento \\11
seguito da niente. In questi
casi la soluzione consiste nell'uso di \${1}1
. In questo modo si
crea un riferimento all'indietro $1
isolato dal numero 1
.
Example #1 Uso dei riferimenti all'indietro seguiti da numeri
<?php
$string = "April 15, 2003";
$pattern = "/(\w+) (\d+), (\d+)/i";
$replacement = "\${1}1,\$3";
echo preg_replace($pattern, $replacement, $string);
?>
This example will output :
Se verranno riconosciuti dei testi, la funzione restituisce la nuova
versione di testo
, altrimenti il parametro
sarà restituito inalterato.
Ogni parametro passato alla funzione preg_replace(),
(eccetto limite
) può essere una matrice ad una dimensione.
Quando si utilizzano matrici con espressione_regolare
e sostituto
, le chiavi sono processate
nell'ordine con cui appaiono nella matrice. Questo
non è necessariamente l'ordine
numerico dell'indice. Se si utilizzano degli indici per
identificare quale espressione_regolare
debba
essere sostituita da sostituto
, occorre eseguire
la funzione ksort() su ciascuna matrice
prima di eseguire preg_replace().
Example #2 Uso di matrici indicizzate con preg_replace()
<?php
$string = "The quick brown fox jumped over the lazy dog.";
$patterns[0] = "/quick/";
$patterns[1] = "/brown/";
$patterns[2] = "/fox/";
$replacements[2] = "bear";
$replacements[1] = "black";
$replacements[0] = "slow";
echo preg_replace($patterns, $replacements, $string);
?>
The bear black slow jumped over the lazy dog.
Utilizzando ksort su entrambe le matrici
otteniamo cio che vogliamo.
<?php
ksort($patterns);
ksort($replacements);
echo preg_replace($patterns, $replacements, $string);
?>
The slow black bear jumped over the lazy dog.
Se il campo testo
è una matrice, la ricerca
e la sostituzione sarà eseguita su ogni elemento della matrice,
e conseguentemente la funzione restituirà una matrice.
Se espressione_regolare
ed sostituto
sono entrambi delle matrici, la funzione preg_replace()
utilizza gli elementi di ciascuna matrice per la ricerca e la sostituzione
delle stringhe in testo
. Nel caso in cui la
matrice passata in sostituto
abbia
meno elementi che espressione_regolare
,
la funzione utilizzerà una stringa vuota per compensare gli
elementi mancanti nella fase di sostituzione. Se, invece,
espressione_regolare
è una matrice,
mentre il campo sostituto
è una stringa,
quest'ultima sarà usata come valore da sostituire ad ogni testo
riconosciuto. Un discorso contrario non ha senso.
Il modificatore /e
, permette alla funzione
di considerare il testo posto in sostituto
come codice PHP dopo aver valorizzato gli opportuni riferimenti.
Suggerimento: accertarsi che sostituto
sia del codice PHP valido, altrimenti si ottiene un errore di
parsing alla linea della funzione preg_replace().
Example #3 Esempi di sostituzione di valori
<?php
$patterns = array ("/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/",
"/^\s*{(\w+)}\s*=/");
$replace = array ("\\3/\\4/\\1\\2", "$\\1 =");
echo preg_replace($patterns, $replace, "{startDate} = 1999-5-27");
?>
Questo esempio visualizzerà:
Example #4 Utilizzo del modificatore /e
<?php
preg_replace("/(<\/?)(\w+)([^>]*>)/e",
"'\\1'.strtoupper('\\2').'\\3'",
$html_body);
?>
Nell'esempio precedente tutti i tag HTML presenti nel testo di
input saranno convertiti in maiuscolo.
Example #5 Esempio di conversione di codice HTML in testo
<?php
// $document contiene un documento HTML.
// In questo esempio la funzione rimuove i tag HTML,
// le sezioni javascript e gli spazi bianchi.
// Inoltre si convertirà le entità HTML nella loro
// rappresentazione testuale.
$search = array ("'<script[^>]*?>.*?</script>'si", // Rimozione del javascript
"'<[\/\!]*?[^<>]*?>'si", // Rimozione dei tag HTML
"'([\r\n])[\s]+'", // Rimozione degli spazi bianchi
"'&(quot|#34);'i", // Sostituzione delle entità HTML
"'&(amp|#38);'i",
"'&(lt|#60);'i",
"'&(gt|#62);'i",
"'&(nbsp|#160);'i",
"'&(iexcl|#161);'i",
"'&(cent|#162);'i",
"'&(pound|#163);'i",
"'&(copy|#169);'i",
"'&#(\d+);'e"); // Valuta come codice PHP
$replace = array ("",
"",
"\\1",
"\"",
"&",
"<",
">",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
"chr(\\1)");
$text = preg_replace($search, $replace, $document);
?>
Nota:
Il parametro limite
è stato aggiunto
successivamente alla versione 4.0.1pl2 di PHP.
Vedere anche preg_match(),
preg_match_all() e
preg_split().