2011-07-13 963 views
0
var formatChart = { 
    '[newline]' : '<br />', 
    '[tab]' : '&nbsp;&nbsp;&nbsp;&nbsp;', 
    '[space]' : '&nbsp;' 
}; 


// Formats a string according to the formatting chart 
var formatString = function(string) 
{ 
    for (var k in formatChart) 
    { 
     while (string.indexOf(formatChart[k]) != -1) 
      string = string.replace(k, this.formatChart[k]); 
    } 
    return string; 
}; 

var str = "Hello[newline]World[tab]Tab[space]Hello[newline]Done"; 
alert(formatString(str)); 

上面的代码应该用它们的HTML替换替换所有出现的“特殊”字符([newline]等)。但它不起作用。JavaScript String.Replace()不起作用

为什么?

+0

除了下面,你也将需要从'this.formatChart [K]摆脱''this.'。 'this'指向你的formatString函数 – bcoughlan

回答

4

要当心,取代JavaScript和正则表达式的作品。这不是你想要做的。通常的做法是使用组合连接和拆分功能。

另外,您正在测试替换的字符串是否存在于第一个位置(formatChart [k]),但是您想测试replacee(k)是否在该字符串中。

这里是一个示例代码:

function formatString(str) { 
    for (var k in formatChart) { 
     str = str.split(k).join(formatChart[k]); 
    } 

    return str; 
} 
+3

不,如果您使用字符串作为第一个参数,则'replace'方法不适用于正则表达式。另外,如果你使用'split'和'join',你不应该循环。 – Guffa

+0

我正在循环,因为OP想要在他的字符串中替换几个子字符串。 – deadalnix

+0

当您替换了一个子字符串时,它不再存在于字符串中,因此您不必循环以尝试再次替换它。 – Guffa

2

您正在搜索结果值的字符串,而不是键。试试这个:

var formatString = function(str) 
{ 
    for (var k in formatChart) 
    { 
     while (str.indexOf(k) != -1) 
      str = str.replace(k, formatChart[k]); 
    } 
    return str; 
}; 
+0

这将导致一个永恒的循环,因为'str'的​​值永远不会改变。 – Guffa

+0

你是什么意思?声明'str = str.replace(k,formatChart [k]);'修改'str',不是吗?另外,当我测试它时,它不会循环。 – gereeter

+0

代码是'string = str.replace(k,formatChart [k]);'当我写评论的时候。 – Guffa

1

string.indexOf(formatChart[k]) != -1是错的。在迭代Object时(实际上不应该这样做),k值是Key。你想要string.indexOf(k) != -1

+0

我很好奇你为什么说你不应该迭代一个对象(假设使用hasOwnProperty) - 你还会如何遍历JavaScript中的一个(伪)关联数组? – tomfumb

+0

'...在我看来,在循环中对于内置对象只是不好的。这是因为内置插件有许多额外的不需要的属性。例如,数组有长度。另一方面,对于用户制作的哈希表来说,它是非常宝贵的。你知道你在那里放置什么,只要你不扩展Object.prototype,你就不会有任何额外的属性。请注意,如tomfumb提到的那个特殊问题可以通过'hasOwnProperty'修复。 – gereeter

1

取而代之的是:

while (string.indexOf(formatChart[k]) != -1) 

试试这个:

while (string.indexOf(k) != -1) 
1

。在你的功能的小错误。更换

while (string.indexOf(formatChart[k]) != -1) 

通过

while (string.indexOf(k) != -1) 

,并查看结果

0

错误:while (string.indexOf(formatChart[k]) != -1)

正确:while (string.indexOf(k) != -1)

1

这里有一个稍微不同的正则表达式版本。这逃避了要替换的东西的正则表达式字符,所以我们可以使用全局替换正则表达式替换函数。你需要在括号前面加双反斜杠,这样当你以正则表达式传递时,你的反斜杠就会留下。

var formatChart = { 
    '\\[newline\\]' : '<br />', 
    '\\[tab\\]' : '&nbsp;&nbsp;&nbsp;&nbsp;', 
    '\\[space\\]' : '&nbsp;' 
}; 

var str = "Hello[newline]World[tab]Tab[space]Hello[newline]Done"; 

function formatString(str) { 
    for (var i in formatChart) { 
     str = str.replace(new RegExp(i, "gi"), formatChart[i]); 
    } 
    return(str); 
} 

你可以看到它在这里的行动:http://jsfiddle.net/jfriend00/pj2Kr/