2010-10-11 19 views
24

在Javascript中,當我把一個反斜槓一些變量,如:JavaScript的反斜線變量()導致錯誤

var ttt = "aa ///\\\"; 
var ttt = "aa ///\"; 

Javscript顯示錯誤信息。

如果我嘗試進入這個角色來限制用戶,我也得到一個錯誤:

(("aaa ///\\\").indexOf('"') != -1) 

來自用戶的輸入限制反斜槓是不是一個很好的策略,因爲你必須要表現出一個惱人的消息給用戶。

爲什麼我得到反斜槓錯誤?

+0

scackoverflow來自世界各地的剝奪我的1個slashe,即使是在()有1個斜槓(\\)。真正的斜槓序列是一個變量的3個斜槓 – Imrul 2010-10-11 04:19:57

+0

輸入字符串從哪裏來?它來自瀏覽器本身(用戶輸入)還是來自後端(由PHP/Perl/Ruby /等插入)?我問,因爲它看起來像你試圖使用JavaScript來解決這完全沒有意義。用戶直接在瀏覽器中輸入的所有字符串已經被轉義,因此您不需要進行任何轉義。唯一的問題將是在後端檢索的內容。 – slebetman 2010-10-11 04:41:42

+0

是的,它來自瀏覽器中HTML輸入的用戶輸入,操作是不使用JavaScript。我在後端使用ASP.NET(C#)。 ASP.NET中沒有'addslashes'函數。如果這可以在服務器端解決,那麼也可以。 – Imrul 2010-10-11 04:46:21

回答

62

反斜線(\)是escape character在Javascript中(以及許多其他C語言)。這意味着當Javascript遇到反斜槓時,它會嘗試轉義下面的字符。例如,\n是換行符(而不是反斜槓,後跟字母n)。

爲了輸出文字反斜槓,您需要轉義。這意味着\\將輸出一個反斜槓(並且\\\\將輸出兩個,依此類推)。 "aa ///\"不起作用的原因是因爲反斜槓轉義了"(它將打印文字引號),因此您的字符串未正確終止。同樣,"aa ///\\\"將不起作用,因爲最後一個反斜槓再次轉義引號。

只要記住,對於要輸出的每個反斜槓,您需要提供Javascript 兩個

+1

我會覺得你用'\\'搞糊塗了'//'。 – Gumbo 2010-10-11 05:20:07

+2

哎呀,那是我在1:15上午寫回答時發生的情況;)修正了。 – 2010-10-11 05:20:31

+1

很好的解釋。我爲此投了1票。但我不接受這個,因爲我沒有得到答案。輸入在用戶的手中,並且如果用戶嘗試輸入這種序列,那麼是否有可能克服這一點。 – Imrul 2010-10-11 08:23:39

4

你要逃避每個\\\

var ttt = "aa ///\\\\\\"; 

更新:我認爲這個問題是不是在字符串中的轉義字符都沒有。提問者似乎沒有正確解釋問題。

because you had to show a message to user that user can't give a name which has (\) character.

我認爲情況是這樣的:

var user_input_name = document.getElementById('the_name').value; 

然後提問者要檢查是否user_input_name包含任何[\。如果是,則提醒用戶。

如果用戶在HTML輸入框中輸入[aa ///\],那麼如果你alert(user_input_name),你會看到[aaa ///\]。您不需要轉義,即在JavaScript代碼中將[\]替換爲[\\]。當你轉義的時候,那是因爲你試圖用一個包含特殊字符的字符串作爲的JavaScript源代碼。如果你不這樣做,它將不會被正確解析。既然你已經得到了一個字符串,你不需要將它傳遞給一個轉義函數。如果你這樣做,我猜你正在從JavaScript代碼中生成另一個JavaScript代碼,但在這裏並不是這樣。

我在猜測提問者想模擬輸入,所以我們可以理解這個問題。不幸的是,提問者不太瞭解JavaScript。因此,提供給我們的語法錯誤代碼:

var ttt = "aa ///\"; 

因此,我們假設提交者有轉義問題。

如果你想模擬,你的代碼必須在第一個地方有效。現在

var ttt = "aa ///\\"; // <- This is correct 
// var ttt = "aa ///\"; // <- This is not. 

alert(ttt); // You will see [aa ///\] in dialog, which is what you expect, right? 

,你只需要做的就是

var user_input_name = document.getElementById('the_name').value; 
if (user_input_name.indexOf("\\") >= 0) { // There is a [\] in the string 
    alert("\\ is not allowed to be used!"); // User reads [\ is not allowed to be used] 
    do_something_else(); 
    } 

編輯:我以前[]引用文字表現出來,所以這將是比使用""較少的困惑。

+0

請參閱此鏈接 http://javascript.about.com/library/bladdslash.htm& http://www.navioo.com/javascript/tutorials/Javascript_addslashes_1558.html 他們做了同樣的事情,但如果我使用 var t = addslashes(「aa /// \\\」) 然後我得到錯誤! – Imrul 2010-10-11 04:40:08

+0

你在服務器端用PHP編碼嗎?因爲'var t'似乎不是一個PHP變量聲明。 – livibetter 2010-10-11 04:47:49

+0

我正在使用JavaScript解決此問題。我試圖使用escape(string)和unescape(string)。但是,這些都不起作用 – Imrul 2010-10-11 04:59:01

0

的的jsfiddle鏈接到我嘗試了您的查詢http://jsfiddle.net/A8Dnv/1/其做工精細 @Imrul提到您正在使用C#在服務器端,你不介意,要麼:http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.escape.aspx

+0

HTML不是JavaScript。 – Gumbo 2010-10-11 05:18:59

+0

@gumbo和你的觀點是? btw imrul聲明「是的,它是在瀏覽器中HTML輸入提交的用戶輸入內容」,如果你能詳細說明謝謝 – jknair 2010-10-11 05:32:01

6

你可能想嘗試以下,這或多或少逃跑用戶輸入的標準方式:

function stringEscape(s) { 
    return s ? s.replace(/\\/g,'\\\\').replace(/\n/g,'\\n').replace(/\t/g,'\\t').replace(/\v/g,'\\v').replace(/'/g,"\\'").replace(/"/g,'\\"').replace(/[\x00-\x1F\x80-\x9F]/g,hex) : s; 
    function hex(c) { var v = '0'+c.charCodeAt(0).toString(16); return '\\x'+v.substr(v.length-2); } 
} 

這將替換所有的反斜線有一個轉義反斜槓,然後繼續逃跑其他非打印字符到他們的轉義表單。它還可以轉義單引號和雙引號,因此即使在eval中,您也可以將輸出用作字符串構造函數(考慮到您正在使用用戶輸入,這本身就是一個壞主意)。但無論如何,它應該做你想要的工作。

+0

請在HTML HEAD中添加函數後運行此操作。你會看到不同之處。 – Imrul 2010-10-11 08:14:00

+0

@Imrul,不知道我明白。使用「aa /// \\\」編寫*腳本*與獲取「aa /// \\\」作爲用戶輸入不同。在前一種情況下,三重反斜槓和它們後面的雙引號被解釋爲單個反斜槓,後跟雙引號。在後面的例子中,輸入是逐字解釋的,並且包含三個反斜槓。 stringEscape()函數將用戶輸入轉換爲腳本形式的字符串文字。我認爲這就是你想要達到的目標,不是嗎? – 2010-10-11 08:59:19

0

如果要在javascript變量值中使用特殊字符,則需要使用轉義字符\)。

反斜槓在你的例子中也是特殊字符。

所以,你應該做這樣的事情,

var ttt = "aa ///\\\\\\"; // --> ///\\\ 

var ttt = "aa ///\\"; // --> ///\ 

轉義字符不需要用戶輸入。

當您在提示框或輸入欄中按/然後提交時,表示單個/

2

反斜槓\被保留用作Javascript中的轉義字符。

要逐字使用反斜槓,你需要使用兩個反斜槓

\\