PDA

View Full Version : [PHP] preg_replace


ianaz
07-08-2006, 19:40
Salve, avrei bisogno una spiegazione per la funzione preg_replace
Non mi piace scomodare la gente specialmente per sciocchezze del genere ma ho cercato senza alcun risultato ;)


Ho capito cosa fa la funzione ma non capisco ancora alcune cose...
esempio:

$message = preg_replace("/\[b\](.*?)[\/b]", "<B>\\1</B>", $message);


1. /\[b\](.*?)[\/b] capisco che prende tutti i tag qualcosa ma come mai tutte quelle slashes e backslashes?
2. Il \\1 che cosa fa?
3. e il (.*?) ?


Grazie :)

P.S: Non incollatemi testi da php.net perché l'ho letta tutta la pagina dedicata a questa funzione ma non ci ho capito comunque niente

andbin
07-08-2006, 20:35
$message = preg_replace("/\(.*?)[\/b]", "<B>\\1</B>", $message);


1. /\(.*?)[\/b] capisco che prende tutti i tag qualcosa ma come mai tutte quelle slashes e backslashes?
2. Il \\1 che cosa fa?
3. e il (.*?) ?Intanto, come premessa, l'espressione regolare indicata sopra non è giusta. Vediamo di capire il perché.

Come espressione regolare, sarebbe corretto:
\(.*?)\[\/b\]
I caratteri [ e ] sono "speciali" nelle espressioni regolari. Il / pure ma è una cosa specifica della preg_replace (lo vediamo dopo).

Dal momento che l'espressione regolare è specificata come stringa "literal' in PHP, bisogna ulteriormente fare l'escape del carattere '\', perché in PHP, nelle stringhe il \ è nuovamente un carattere "speciale".

Quindi avremo come stringa:
"\\[b\\](.*?)\\[\\/b\\]"

La preg_replace si aspetta che l'espressione regolare sia messa tra / ... /. Quindi avremo:
"/\\[b\\](.*?)\\[\\/b\\]/"

Ecco il perché del / è stato fatto l'escape con \\/

In definitiva abbiamo:
$message = preg_replace("/\\[b\\](.*?)\\[\\/b\\]/", "<B>\\1</B>", $message);

Data una stringa in input del tipo:
[b]Ciao [b]Hellonoi vorremmo avere in uscita:
<B>Ciao</B> <B>Hello</B>Per questo motivo si usa (.*?), notare il ? dopo .*
Questo perché il *? è un quantificatore "riluttante", cerca di catturare meno caratteri possibili. In pratica si ferma al dopo Ciao, non quello dopo Hello.

Le parentesi servono per formare un "sub-pattern". Quello che viene catturato dentro le parentesi, può essere poi riportato nella sostituzione usando la notazione \x (quindi nella stringa PHP \\x). Dove x è un numero 1, 2, ....

Ho soddisfatto tutte le tue domande?? ;)

ianaz
07-08-2006, 20:38
Ho soddisfatto tutte le tue domande?? ;)
Chiarissimo, grazie mille :)