Escape nelle espressioni regolari

Io pensavo che la regexp '@\\\*@' trovasse la corrispondenza per \* (il primo \ fa l'escape del secondo \ mentre il terzo \ fa l'escape di *, no?), invece  è '@\\\\\*@' che trova tale corrispondenza ???!!

Fate un po' la prova:

$string = '\*';
if (preg_match ('@\\\\\*@', $string, $matches))  { echo "<pre>"; print_r ($matches); echo "</pre>"; }
else  echo "Nessun riscontro";

Davvero non riesco a spiegarmelo, qualcuno può?

 :bye:

inviato 9 anni fa
usecram
X 0 X

Cambia nulla se in preg_match metti i doppi apici al posto degli apici singoli?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X
Cambia nulla se in preg_match metti i doppi apici al posto degli apici singoli?

Normalmente uso le virgolette singole in modo che \ non diventi un carattere speciale anche per PHP  :crazy:

, comunque non cambia nulla.

risposto 9 anni fa
usecram
X 0 X

Temo che il problema sia proprio quello, cioè che lo slash abbia prima un significato per le stringhe PHP e poi per l'espressione regolare, quindi vanno usati due slash per farne arrivare uno all'espressione regolare.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Esatto Gianni,

lo zend engine compila il doppio blackslash come singolo e lo passa al PCRE chepensa sia quinid per escapare il carattere successivo.

Ecco il perchè dei doppi doppi. ;)

CIao

risposto 9 anni fa
Thesee
X 0 X
cioè che lo slash abbia prima un significato per le stringhe PHP e poi per l'espressione regolare, quindi vanno usati due slash per farne arrivare uno all'espressione regolare.

Sì non può che essere così tra apici doppi...il problema è che tra apici singoli, come avevo mostrato nel primo esempio, il backslash non dovrebbe avere un significato speciale per PHP tanto è vero che echo '\n'; stampa proprio \n? L'escape dovrebbe essere solo per PCRE e quindi \\\*.

Leggevo il manuale:

http://www.php.net/manual/it/language.types.string.php

Single quoted

The easiest way to specify a simple string is to enclose it in single quotes (the character ').

To specify a literal single quote, you will need to escape it with a backslash (\), like in many other languages. If a backslash needs to occur before a single quote or at the end of the string, you need to double it. Note that if you try to escape any other character, the backslash will also be printed! So usually there is no need to escape the backslash itself.

Boh :-\

risposto 9 anni fa
usecram
X 0 X

anche con gli apici singoli lo slash ha un significato, serve a fare l'escape di un apice:

$apice = '\'';

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Già quindi in conclusione

lo zend engine compila il doppio blackslash come singolo e lo passa al PCRE chepensa sia quinid per escapare il carattere successivo

e questo sia tra singoli che doppi apici,giusto?.

Devo aver travisato un libro che sto leggendo (che comunque non è che a proposito sia il massimo della chiarezza).

Grazie :bye:

risposto 9 anni fa
usecram
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda