2011-07-13 69 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/