我正在尝试重写一个javascript函数,因为我被告知这个函数有点令人讨厌的代码安静,它可以很好地由一个非常友好的用户从这里编写。
我一直试图理解这个函数的作用,因此我可以正确地重写它,但是因为我不完全理解它是如何工作的,这是一项非常困难的任务。
因此,我正在寻找帮助和指示(不是我想学习自己的解决方案)以更好的方式理解和重写这个功能。
它是处理特殊字符的函数,我知道它会循环发送给它的字符串,搜索特殊字符,并将它需要的内容添加到字符串中以使其成为有效的字符串。
我一直在尝试使用value.replace(/“/ gi,”/“”),但肯定是因为崩溃而做错了。
有人能告诉我从哪里开始重新编码功能吗?
任何帮助都将不胜感激。
我对该功能的评论是大写字母。 代码
<script type="text/javascript">
function convertString(value){
for(var z=0; z <= value.length -1; z++)
{
//if current character is a backslash||WHY IS IT CHECKING FOR \\,\\r\\n,and \\n?
if(value.substring(z, z + 1)=="\\" && (value.substring(z, z + 4)!="\\r\\n" && value.substring(z, z + 2)!="\\n"))
{//WHY IS IT ADDING \\\\ TO THE STRING?
value = value.substring(0, z) + "\\\\" + value.substring(z + 1, value.length);
z++;
}
if(value.substring(z, z + 1)=="\\" && value.substring(z, z + 4)=="\\r\\n")
{//WHY IS IT ADDING 4 TO Z IN THIS CASE?
z = z+4;
}
if(value.substring(z, z + 1)=="\\" && value.substring(z, z + 2)=="\\n")
{//WHY IS IT ADDING 2 TO Z IN THIS CASE?
z = z+2;
}
}
//replace " with \"
//loop through each character
for(var x = 0; x <= value.length -1; x++){
//if current character is a quote
if(value.substring(x, x + 1)=="\""){//THIS IS TO FIND \, BUT HAVENT THIS BEEN DONE BEFFORE?
//concatenate: value up to the quote + \" + value AFTER the quote||WHY IS IT ADDING \\ BEFORE \"?
value = value.substring(0, x) + "\\\"" + value.substring(x + 1, value.length);
//account for extra character
x++;
}
}
//return the modified string
return(value);
}
<script>
大写字母代码中的注释是我对上述功能的质疑。
我很感激任何帮助,方向,建议,但不是解决方案,我想学习。
答案 0 :(得分:1)
代码似乎正在对字符串进行某种转义。在第一个循环中,它将\
的所有实例替换为\\
,除非它们位于\r\n
或\n
序列之前,在这种情况下它会跳过它们。正如评论所说,第二个循环正在用"
替换\"
。我不完全确定为什么它会逃避单独的反斜杠但是只留下新的线条。
我认为令你困惑的是反斜杠字符是一个转义字符:它从后面的字符中删除任何特殊含义。例如,如果我想在我的代码中使用字符串this is a "string"
,我会按如下方式编写它:
var foo = "this is a \"string\"";
在这种情况下,转义字符会阻止"
字符终止字符串(正弦它们是它的一部分)。当然,如果你想在字符串中使用实际的反斜杠,你需要用另一个反斜杠来转义它,例如:
var foo = "this is a file path: C:\\bar\\some-file.txt";
同样,\r
和\n
分别表示回车符和换行符。在Windows平台上,\r\n
用于新行,而在Linux平台上,则使用\n
。
有关escape characters和newlines的更多信息,请参阅维基百科。
要解决有关为什么将4和2添加到z
的原因的问题,在每种情况下,增量对应于要跳过的字符数。 "\\n"
字符串文字的值为\n
,这是两个字符,因此将{2}添加到z
。同样,"\\r\\n"
是四个字符,因此将{4}添加到z
。
很抱歉,如果我的错误结束了!
答案 1 :(得分:1)
好的,让我们一步一步。
//如果当前字符是a 反斜杠||为什么要检查 \,\ r \ n和\ n?
\是一个特殊字符,称为escape character。 \,\ r和\ n都是escape sequences。还有其他几个javascript escape sequences,但这些是你要处理的。如果查找最后一个链接,您将看到\是添加反斜杠的转义序列。由于\本身是一个转义字符,因此在字符串中添加\需要添加两个字符串。它为所有两个\的组执行此操作,只要转义序列不是换行符(\ n),也不是\ r \ n,一个窗口换行符。当您的字符串稍后使用时,\将最终成为输出中的单个\。
//为什么在这里添加4到Z. CASE?
脚本在另外两个if中添加4和2到z的原因是因为它确定了该长度的转义序列,因此不需要检查序列中的其他字符。例如,考虑字符串“AAABAAACAAA”
如果我想使用相同的方法,逐个字符循环,并将A的所有实例更改为D,那么我可能会这样做:
for (i = 0; i < myString.length; i++) {
if (myString.substring(i) == 'A') {
myString = myString.substring(0, i) + 'D' + myString.substring(i+1, myString.length);
}
}
相反,如果我知道我的所有A都是3组,就像我的情况一样,我可以做到这一点
for (i = 0; i < myString.length; i++) {
if (myString.substring(i, i+3) == 'AAA') {
myString = myString.substring(0, i) + 'DDD' + myString.substring(i+3,myString.length);
i+= 3;
}
}
在这里,我发现了AAA的发生。我第一次找到AAA我的i = 0.因为我在i == 0时找到AAA,而我用DDD替换它们,我知道i + 1和i + 2不会包含字母A(因为我只是替换了他们)...所以我可以跳过去,在下一个循环中开始处理三个字符。
//这是为了找到\,但是要经常这样做 BEE DIE BEFFORE?
不,在这里你正在寻找\“,双引号的转义序列。
尝试此操作以查看输出的差异。
var testString = "This is a \"string\" with \"escape sequences\".\nIt \"escapes\" backslashes like this \\ and double quotes like this \" but leaves new lines alone";
alert(testString);
alert(convertString(testString));