2009-09-03 24 views
12

Sto tentando di sostituire il carattere backslash (escape) in una stringa letterale Javascript.Javascript - Sostituzione del carattere di escape in una stringa letterale

ho bisogno di sostituirlo con una doppia barra rovesciata in modo che possa poi fare un redirect:

var newpath = 'file:///C:\funstuff\buildtools\viewer.html'.replace(/\\/g,"\\"); 
window.location = newpath; 

Tuttavia, sembra non avere alcun risultato.

Non ho la possibilità di eseguire correttamente l'escape dei backslash prima che vengano gestiti da Javascript.

Come posso sostituire (\) con (\\) in modo che Javascript sia felice?

Grazie, Derek

+0

Se si memorizza il backslash in HTML è possibile utilizzare '.Rimontare (/ \\/g, "\\\\");' con esso. Ad esempio, se c'è una barra rovesciata nel documento HTML, allora puoi andare a 'document.body.innerHTML.replace (/ \\/g," \\\\ ");', che sostituirà tutte le barre inverse con una doppia barra rovesciata. – Viliami

risposta

21

Se si tratta di un letterale, è necessario sfuggire alle backslash prima Javascript li vede; non c'è modo di aggirare questo.

var newpath = 'file:///C:\\funstuff\\buildtools\\viewer.html'; 
window.location = newpath; 

Se newpath sta ottenendo il suo valore da qualche altra parte, e in realtà contiene singole barre rovesciate, non c'è bisogno di raddoppiare in su; ma se si voleva davvero per qualche motivo, non dimenticate di sfuggire alle backslash nella chiamata replace():

newpath.replace(/\\/g,"\\\\"); 

Perché non ha la possibilità di sfuggire correttamente i backslash prima di essere gestite da JavaScript ? Se il problema è che la vostra sorgente JavaScript viene generato da un altro linguaggio di scripting che si utilizza \ come carattere di escape, è sufficiente aggiungere un livello di fuga:

var newpath = 'file:///C:\\\\funstuff\\\\buildtools\\\\viewer.html'; 
+0

Grande risposta moonshadow. Non riesco a modificare il percorso prima che Javascript lo veda, perché è interpolato nel Javascript da un'attività di copia e filtro ANT. Dovrò inserire una richiesta di modifica per l'attività ANT. Puoi spiegare perché è impossibile sostituire il carattere di escape in una stringa letterale ma è possibile in un oggetto stringa? Ho letto questo, ma io ancora non vedo il motivo per cui questa differenza esiste: The Complete Javascript Strings Reference dbasch

+0

ho letto questo, ma io ancora non vedo il motivo per cui questa differenza esiste: http://www.hunlock.com/blogs/The_Complete_Javascript_Strings_Reference Spiacente, sono uno Stack Overflow n00b;) – dbasch

+0

@dbasch: il codice di esempio non può sostituire i caratteri '\' perché i caratteri non esistono più nella stringa al momento dell'esecuzione di replace(). Sono caratteri di escape: caratteri che controllano l'analisi della stringa letterale e vengono consumati nel processo. – moonshadow

2

si dovrebbe essere sostituirli con "\\\\" perché "\\" sta scappando in un singolo \ quindi nessun cambiamento.

+0

Ho provato questo e non ha fatto la sostituzione. – dbasch

0

di dimostrare e comprendere meglio il stringa-fuga comportamento, prendere il seguente esempio:

si può vedere ciò la stringa assomiglia in memoria dopo essere stato analizzato dal JS-motore di suddividendo la stringa, quindi offrendo anche possibili soluzioni (brutto) risolvere questo problema:

'file:///C:\funstuff\buildtools\viewer.html'.split('') 
//> 
["f", "i", "l", "e", ":", "/", "/", "/", "C", ":", "", "u", "n", "s", "t", "u", 
    "f", "f", "", "u", "i", "l", "d", "t", "o", "o", "l", "s", "", "i", "e", "w", 
    "e", "r", ".", "h", "t", "m", "l"] 

'file:///C:\funstuff\buildtools\viewer.html'.split('').map(function(e){ 
    return e.charCodeAt() 
}); 
//> 
[102, 105, 108, 101, 58, 47, 47, 47, 67, 58, 12, 117, 110, 115, 116, 117, 102, 
102, 8, 117, 105, 108, 100, 116, 111, 111, 108, 115, 11, 105, 101, 119, 101, 
114, 46, 104, 116, 109, 108] 
//>in Hex values by applying .toString(16) 
["66", "69", "6c", "65", "3a", "2f", "2f", "2f", "43", "3a", "c", "75", "6e", 
"73", "74", "75", "66", "66", "8", "75", "69", "6c", "64", "74", "6f", "6f", 
"6c", "73", "b", "69", "65", "77", "65", "72", "2e", "68", "74", "6d", "6c"] 

Fondamentalmente il singolo backslash sfugge il carattere seguente, dando luogo a risultati inaspettati, se l'escape-contesto non viene ascoltato.

Soluzione:

Attraverso un look-up-table, è possibile ripristinare molti errantly caratteri di escape se essi si trovano al di fuori della gamma di caratteri ASCII stampabili di \x20-\x7F. Ad esempio, per esempio, 12 o \x0c [12..toString(16)] diventerebbe '\\'+'v' e così via.

PS: essere consapevoli del fatto che una perdita di informazioni si è verificato, e si stanno cercando di ripristinare le informazioni attraverso l'informazione contextual- o meta-, che significa nel tuo caso che la stringa è nel range ASCII stampabile.

Si prega di condividere eventuali implementazioni con la comunità. Saluti!

-1

< < caratteri di escape sostituzione >>

import java.util.Scanner; 

public class Example7 { 

    public static void main(String[] args) { 
    Scanner in=new Scanner(System.in); 
    System.out.println("Please enter a sentence: "); 
    String a=in.nextLine(); 
    //System.out.println("the word had enter: "+a); 

    String Str1 = a.replace("\\n", "(new_line)"); 
    //System.out.println(Str1); 
    String Str2 = Str1.replace("\\t", "(tab)"); 
    //System.out.println(Str2); 
    String Str3 = Str2.replace("\\t", "(tab)"); 
    String Str4 = Str3.replace("\\\\", "(comment_line)"); 
    String Str5 = Str4.replace(":)", "(smile) "); 
    System.out.println("The new sentence:" +Str5); 
    } 
} 
Problemi correlati