帮助理解和重新编码javascript函数来处理特殊字符

时间:2010-02-17 16:22:36

标签: javascript

我正在尝试重写一个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>

大写字母代码中的注释是我对上述功能的质疑。

我很感激任何帮助,方向,建议,但不是解决方案,我想学习。

2 个答案:

答案 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 charactersnewlines的更多信息,请参阅维基百科。

要解决有关为什么将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));