变量中的 JavaScript 反斜杠 (\) 导致错误

IT技术 javascript
2021-01-12 16:19:10

在 Javascript 中,当我在某些变量中添加反斜杠时,例如:

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

Javascript 显示错误。

如果我尝试限制用户输入此字符,我也会收到错误消息:

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

限制用户输入的反斜杠不是一个好策略,因为您必须向用户显示令人讨厌的消息。

为什么我收到反斜杠错误?

5个回答

反斜杠 ( \) 是Javascript 中转义字符(以及许多其他类似 C 的语言)。这意味着当 Javascript 遇到反斜杠时,它会尝试转义以下字符。例如,\n是一个换行符(而不是反斜杠后跟字母 n)。

为了输出文字反斜杠,您需要转义这意味着\\将输出一个反斜杠(\\\\并将输出两个,依此类推)。原因"aa ///\"不起作用是因为反斜杠转义了"(将打印文字引号),因此您的字符串没有正确终止。同样,"aa ///\\\"也不起作用,因为最后一个反斜杠再次转义了引号。

请记住,对于您要输出的每个反斜杠,您需要为 Javascript 提供两个.

很好的解释。我为此投了 1 票。但我没有接受这个,因为我没有得到答案。输入在用户手中,如果用户尝试输入这种序列,那么是否有可能克服这个问题。
2021-03-20 16:19:10

您可能想尝试以下方法,这或多或少是转义用户输入的标准方法:

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 中也可以将输出用作字符串构造函数(考虑到您使用的是用户输入,这本身就是一个坏主意)。但无论如何,它应该可以完成您想要的工作。

@Imrul,不确定我理解。使用“aa ///\\\\”编写脚本与从用户获取“aa ///\\\\”作为输入不同。在前一种情况下,三重反斜杠和它们后面的双引号被解释为单反斜杠后跟双引号。在后一种情况下,输入被逐字解释,并包含三个反斜杠。stringEscape() 函数将用户输入转换为脚本形式的字符串文字。我以为这就是你想要达到的目标,不是吗?
2021-03-14 16:19:10
<script type="text/javascript"> var ttt = stringEscape("aa ///\\\\"); </script> 请在 HTML HEAD 中添加函数后运行它。你会看到不同之处。
2021-04-05 16:19:10

你必须逃避每个\\\

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

更新:我认为这个问题根本与字符串中的转义字符无关。提问者似乎没有正确解释问题。

因为您必须向用户显示一条消息,该用户不能提供具有 (\) 字符的名称。

我认为场景是这样的:

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

然后询问者想要检查是否user_input_name包含任何 [ \]。如果是,则提醒用户。

如果用户aa ///\在 HTML 输入框中输入 [ ],那么如果您alert(user_input_name),您将看到 [ aaa ///\]。您不需要转义,即在 JavaScript 代码中将\[ \\]替换为 [ ]。当您进行转义时,那是因为您试图JavaScript 源代码中创建包含特殊字符的字符串如果你不这样做,它就不会被正确解析。由于您已经获得了一个字符串,因此您无需将其传递给转义函数。如果你这样做,我猜你是从一个 JavaScript 代码生成另一个 JavaScript 代码,但这里不是这种情况。

我猜提问者想模拟输入,所以我们可以理解这个问题。不幸的是,asker 不太了解 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();
  }

编辑:我曾经[]引用要显示的文本,所以它不会比使用"".

然后,我的回答已经告诉你如何在 JS 代码中输入字符串时转义 \。escape()不是为了这个目的。
2021-03-24 16:19:10
我正在使用 javascript 来解决这个问题。我尝试使用escape(string) 和unescape(string)。但这些也不起作用
2021-03-26 16:19:10
我得到了你的答案。但这不是我想要的。如果您的输入是动态的,那么您如何在字符串中添加额外的斜线。你需要一个函数来做到这一点。我使用了前面提到的一些功能,但我没有得到我想要的。
2021-03-26 16:19:10
请参阅此链接 javascript.about.com/library/bladslash.htm & navioo.com/javascript/tutorials/Javascript_addslashes_1558.html他们做了同样的事情,但如果我使用 var t = addedlashes("aa ///\\\" )然后我出错了!!
2021-03-31 16:19:10
你在服务器端用 PHP 编码吗?因为var t看起来不像 PHP 变量声明。
2021-04-09 16:19:10

反斜杠\保留用作 Javascript 中的转义字符。

要从字面上使用反斜杠,您需要使用两个反斜杠

\\

如果要在 javascript 变量值中使用特殊字符,则需要转义字符( \)。

您示例中的反斜杠也是特殊字符。

所以你应该做这样的事情,

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

或者

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

用户输入不需要转义字符

当您/在提示框或输入字段中按下然后提交时,这意味着 single /