在Javascript中,當我把一個反斜槓一些變量,如:JavaScript的反斜線變量()導致錯誤
var ttt = "aa ///\\\";
var ttt = "aa ///\";
Javscript顯示錯誤信息。
如果我嘗試進入這個角色來限制用戶,我也得到一個錯誤:
(("aaa ///\\\").indexOf('"') != -1)
來自用戶的輸入限制反斜槓是不是一個很好的策略,因爲你必須要表現出一個惱人的消息給用戶。
爲什麼我得到反斜槓錯誤?
在Javascript中,當我把一個反斜槓一些變量,如:JavaScript的反斜線變量()導致錯誤
var ttt = "aa ///\\\";
var ttt = "aa ///\";
Javscript顯示錯誤信息。
如果我嘗試進入這個角色來限制用戶,我也得到一個錯誤:
(("aaa ///\\\").indexOf('"') != -1)
來自用戶的輸入限制反斜槓是不是一個很好的策略,因爲你必須要表現出一個惱人的消息給用戶。
爲什麼我得到反斜槓錯誤?
反斜線(\
)是escape character在Javascript中(以及許多其他C語言)。這意味着當Javascript遇到反斜槓時,它會嘗試轉義下面的字符。例如,\n
是換行符(而不是反斜槓,後跟字母n)。
爲了輸出文字反斜槓,您需要轉義它。這意味着\\
將輸出一個反斜槓(並且\\\\
將輸出兩個,依此類推)。 "aa ///\"
不起作用的原因是因爲反斜槓轉義了"
(它將打印文字引號),因此您的字符串未正確終止。同樣,"aa ///\\\"
將不起作用,因爲最後一個反斜槓再次轉義引號。
只要記住,對於要輸出的每個反斜槓,您需要提供Javascript 兩個。
你要逃避每個\
是\\
:
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();
}
編輯:我以前[]
引用文字表現出來,所以這將是比使用""
較少的困惑。
請參閱此鏈接 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
你在服務器端用PHP編碼嗎?因爲'var t'似乎不是一個PHP變量聲明。 – livibetter 2010-10-11 04:47:49
我正在使用JavaScript解決此問題。我試圖使用escape(string)和unescape(string)。但是,這些都不起作用 – Imrul 2010-10-11 04:59:01
的的jsfiddle鏈接到我嘗試了您的查詢http://jsfiddle.net/A8Dnv/1/其做工精細 @Imrul提到您正在使用C#在服務器端,你不介意,要麼:http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.escape.aspx
你可能想嘗試以下,這或多或少逃跑用戶輸入的標準方式:
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中,您也可以將輸出用作字符串構造函數(考慮到您正在使用用戶輸入,這本身就是一個壞主意)。但無論如何,它應該做你想要的工作。
請在HTML HEAD中添加函數後運行此操作。你會看到不同之處。 – Imrul 2010-10-11 08:14:00
@Imrul,不知道我明白。使用「aa /// \\\」編寫*腳本*與獲取「aa /// \\\」作爲用戶輸入不同。在前一種情況下,三重反斜槓和它們後面的雙引號被解釋爲單個反斜槓,後跟雙引號。在後面的例子中,輸入是逐字解釋的,並且包含三個反斜槓。 stringEscape()函數將用戶輸入轉換爲腳本形式的字符串文字。我認爲這就是你想要達到的目標,不是嗎? – 2010-10-11 08:59:19
如果要在javascript變量值中使用特殊字符,則需要使用轉義字符(\
)。
反斜槓在你的例子中也是特殊字符。
所以,你應該做這樣的事情,
var ttt = "aa ///\\\\\\"; // --> ///\\\
或
var ttt = "aa ///\\"; // --> ///\
但轉義字符不需要用戶輸入。
當您在提示框或輸入欄中按/
然後提交時,表示單個/
。
反斜槓\
被保留用作Javascript中的轉義字符。
要逐字使用反斜槓,你需要使用兩個反斜槓
\\
scackoverflow來自世界各地的剝奪我的1個slashe,即使是在()有1個斜槓(\\)。真正的斜槓序列是一個變量的3個斜槓 – Imrul 2010-10-11 04:19:57
輸入字符串從哪裏來?它來自瀏覽器本身(用戶輸入)還是來自後端(由PHP/Perl/Ruby /等插入)?我問,因爲它看起來像你試圖使用JavaScript來解決這完全沒有意義。用戶直接在瀏覽器中輸入的所有字符串已經被轉義,因此您不需要進行任何轉義。唯一的問題將是在後端檢索的內容。 – slebetman 2010-10-11 04:41:42
是的,它來自瀏覽器中HTML輸入的用戶輸入,操作是不使用JavaScript。我在後端使用ASP.NET(C#)。 ASP.NET中沒有'addslashes'函數。如果這可以在服務器端解決,那麼也可以。 – Imrul 2010-10-11 04:46:21