2009-04-20 19 views
5

Sto usando preg_replace per sfuggire caratteri speciali:

$tmpStr=preg_replace("/\?/", "\?", $tmpStr); 
$tmpStr=preg_replace("/\#/", "\#", $tmpStr); 
$tmpStr=preg_replace("/\^/", "\^", $tmpStr); 
$tmpStr=preg_replace("/\&/", "\&", $tmpStr); 
$tmpStr=preg_replace("/\*/", "\*", $tmpStr); 
$tmpStr=preg_replace("/\(/", "\(", $tmpStr); 
$tmpStr=preg_replace("/\)/", "\)", $tmpStr); 
$tmpStr=preg_replace("/\//", "\/", $tmpStr); 

Ma io non sono in grado di sfuggire $ utilizzando la stessa funzione:

$tmpStr=preg_replace("/\$/", "\$", $tmpStr); 

E anche quando uso la dichiarazione di cui sopra tutti gli spazi diventano sostituito da $ e $ non viene scappato.

Come Escape il simbolo del dollaro in modo corretto?

risposta

12

consiglio vivamente usando preg_quote() invece.

+0

Vorrei trovare questa risposta più utile se ha dato la motivazione per l'uso di preg_quote invece di preg_replace. Inoltre, sarebbe bello sapere perché l'approccio preg_replace non ha funzionato per sfuggire al segno del dollaro. –

+1

@RandallStewart "preg_quote invece di preg_replace"? Queste due funzioni non sono sostituibili, non puoi usarne una al posto dell'altra, usa 'preg_quote' per sfuggire ai valori nelle stringhe di espressioni regolari (usate all'interno di 'preg_replace') –

0

IIRC sostituisci $ con $. Così dovrebbe essere $$

Si può anche provare

$tmpStr=preg_replace('/\$/', '\$', $tmpStr); 
+1

Ho provato questo ... non ha funzionato ... :( –

4

Il segno $ deve essere sfuggito con se stessa in modo

$tmpStr=preg_replace("/$$/", "\$", $tmpStr); 

Vorrei inoltre consigliare di guardare al addslashes invece.

0

non è forse vero che PHP vede \ $ da $? Non l'ho provato, potrebbe andare così;

php è il primo, e sostituisce il tuo "/ \ $ /" con "/ $ /" quindi il motore di preg fa che è magico .. sfortunatamente, $ è un operatore di espressioni regolari (credo che corrisponda alla fine di un stringa?), quindi non trova i caratteri $ nel testo ma lo sarà

Penso che quello che devi fare è raddoppiare sfuggire al carattere $ in questo modo;

$ tmpStr = preg_replace ("/ \ $ /", "\ $", $ tmpStr);

Inoltre .. in questo caso, avrei usato solo str_replace()

3

Sembra che il problema è uno di sfuggire. Le virgolette singole (') in PHP funzionano in modo diverso rispetto alle virgolette doppie ("). E 'un po' come in Perl, in cui l'interpolazione variabile non avviene nelle stringhe singolarmente quotati, e il simbolo del dollaro ($) non è una meta-carattere:

print "\$"; # prints $ 
print '\$'; # prints \$ 

Inoltre, classi di personaggi del Perl semplificheranno il tuo codice:

$tmpStr = preg_replace('/([?#^&*()$\\/])/', '\\\\$1', $tmpStr); 
3

la risposta corretta è che si deve fuggire il backslash e il simbolo del dollaro nella espressione regolare utilizzando caratteri di escape di PHP.

backslash = \\ 
dollar sign = \$ 

$tmpStr=preg_replace("/\\\$/", "\\$", $tmpStr); 

Questo è utile per chiunque debba abbinare una stringa che contiene un segno di dollaro.

2

Sì, sembra che \\$ sia visto da PHP come $ in una stringa con doppia virgoletta. Ciò significa che devi fare in modo che PHP veda \$ dicendo \\\$.

ho appena provato preg_replace("/\\\$$k\\\$/", $v, $data) e in effetti funziona (sostituisce le occorrenze di $KEY$ con VALORE

-1

In PHP, per il caso particolare di "$" utilizzato in HTML, si può anche fare una precedente sostituzione per la sua entità.:

$tmpStr = str_replace('$', '$',$tmpStr); 
0
$pattern = preg_replace('/\$(.+)/', '\\\$$1', $pattern); 
+0

Potresti aggiungere alcuni dettagli riguardanti il ​​tuo codice e come affronta il/i problema/i nella domanda? Le risposte al solo codice non sono molto utili, specialmente per i futuri lettori che incappano in questo post. Grazie, – Cristik

Problemi correlati