JavaScript字符串.Replace()不工作 var formatChart={ “[newline]”:“”, “[选项卡]:”, “[空间]:” }; //根据格式化图表格式化字符串 var formatString=函数(字符串) { for(格式图中的var k) { while(string.indexOf(formatChart[k])!=-1) string=string.replace(k,this.formatChart[k]); } 返回字符串; }; var str=“Hello[newline]World[tab]tab[space]Hello[newline]Done”; 警报(格式化字符串(str));
上面的代码应该用它们的HTML等价物替换所有出现的“特殊”字符([newline],等等)。但它不起作用JavaScript字符串.Replace()不工作 var formatChart={ “[newline]”:“”, “[选项卡]:”, “[空间]:” }; //根据格式化图表格式化字符串 var formatString=函数(字符串) { for(格式图中的var k) { while(string.indexOf(formatChart[k])!=-1) string=string.replace(k,this.formatChart[k]); } 返回字符串; }; var str=“Hello[newline]World[tab]tab[space]Hello[newline]Done”; 警报(格式化字符串(str));,javascript,Javascript,上面的代码应该用它们的HTML等价物替换所有出现的“特殊”字符([newline],等等)。但它不起作用 为什么? 您正在字符串中搜索结果值,而不是键。请尝试以下方法: var formatChart = { '[newline]' : '<br />', '[tab]' : ' ', '[space]' : ' ' }; // Formats a str
为什么? 您正在字符串中搜索结果值,而不是键。请尝试以下方法:
var formatChart = {
'[newline]' : '<br />',
'[tab]' : ' ',
'[space]' : ' '
};
// 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));
string.indexOf(formatChart[k])!=-1
错误。在对象上迭代时(实际上不应该这样做),k
值是关键。您需要string.indexOf(k)!=-1
代替此:
var formatString = function(str)
{
for (var k in formatChart)
{
while (str.indexOf(k) != -1)
str = str.replace(k, formatChart[k]);
}
return str;
};
试试这个:
while (string.indexOf(formatChart[k]) != -1)
你的功能有一个小错误。替换
while (string.indexOf(k) != -1)
借
并查看结果小心,用正则表达式替换javascript中的。这不是你想要做的。通常的方法是使用组合的联接和拆分函数 另外,您正在测试替换的字符串是否首先存在(formatChart[k]),但您希望测试替换的字符串(k)是否在该字符串中 下面是一个示例代码:
while (string.indexOf(k) != -1)
不正确:while(string.indexOf(formatChart[k])!=-1)
正确:
while(string.indexOf(k)!=-1)
这是一个使用正则表达式的小提琴:这是一个稍微不同的正则表达式版本。这将转义要替换的对象中的regex字符,因此我们可以使用regex replace函数的全局替换。在括号前面需要两个反斜杠,这样当作为正则表达式传递时,就只剩下反斜杠了
function formatString(str) {
for (var k in formatChart) {
str = str.split(k).join(formatChart[k]);
}
return str;
}
var formatChart={
“\\[newline\\]”:“
”,
“\\[tab\\]”:“,
“\\[空格\\]”:“”
};
var str=“Hello[newline]World[tab]tab[space]Hello[newline]Done”;
函数格式化字符串(str){
for(格式图中的var i){
str=str.replace(新的RegExp(i,“gi”),formatChart[i]);
}
返回(str);
}
你可以在这里看到它的作用:这将导致一个永恒的循环,因为
str
的值永远不会改变。你是什么意思?语句str=str.replace(k,formatChart[k])代码>修改str
,不是吗?另外,当我测试它时,它不会循环。代码是string=str.replace(k,formatChart[k])代码>当我写评论的时候。除了下面的内容,你还需要从this.formatChart[k]
中去掉this.
这个
指的是你的formatString函数我很好奇为什么你说你不应该在对象上迭代(假设使用了hasOwnProperty)——否则你怎么在JavaScript中遍历(伪)关联数组呢?用于。。。在我看来,在
中,循环只对内置对象有害。这是因为内置有许多额外的不需要的属性。例如,数组具有长度。另一方面,对于用户制作的哈希表来说,它是非常宝贵的。你们知道你们在那个里放了什么,只要你们不扩展Object.prototype,你们就不会有任何额外的属性。请注意,正如tomfumb提到的那样,这个特定问题可以通过hasOwnProperty
解决。不,如果使用字符串作为第一个参数,replace
方法不适用于正则表达式。此外,如果您使用的是split
和join
,则不应循环。我循环是因为OP希望替换其字符串中的几个子字符串。当您替换了一个子字符串时,它在字符串中不再存在,因此您不必再次尝试替换它。是的,这是真的!我只是复制了问题的结构,但你是对的。我将根据这个编辑我的答案。
function formatString(str) {
for (var k in formatChart) {
str = str.split(k).join(formatChart[k]);
}
return str;
}
var formatChart = {
'\\[newline\\]' : '<br />',
'\\[tab\\]' : ' ',
'\\[space\\]' : ' '
};
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);
}