2012-12-08 50 views
2

在下面的代碼中,JavaScript替換函數中的alert(a)將提示匹配的字符串,在這種情況下,它將是{name}和{place}。JavaScript替換

這適用於文檔javascript docs所描述的,即replace方法中函數的第一個參數將是匹配的字符串。在下面的代碼中,alert(b)將提醒'名字'和'地點',但沒有大括號。

這是爲什麼?它如何去掉'b'的花括號?這裏有一個小提琴http://jsfiddle.net/mjmitche/KeHdU/

此外,看着從文檔這個例子,下面

function replacer(match, p1, p2, p3, offset, string){ 
    // p1 is nondigits, p2 digits, and p3 non-alphanumerics 
    return [p1, p2, p3].join(' - '); 
}; 

其中的參數在這個例子中「B」的功能(A,B)的替換功能代表?

我未能理解的部分原因可能是由於我不確定JavaScript是做什麼的,例如,如果沒有使用最大數量的參數,請使用第二個參數。

代碼

var subObject = { 
    name: "world", 
    place: "google" 

}; 

var text = 'Hello, {name} welcome to {place}'; 


var replace = function (s, o) { 
      return s.replace(/\{([^{}]*)\}/g, 
       function (a, b) { 
        alert(a); 
        alert(b); 
       var r = o[b]; 

       return typeof r === 'string' || typeof r === 'number' ? r : a; 
       } 
      ); 
}; 

var replacedText = replace(text, subObject); 
alert(replacedText); ​ 

回答

1

第一個參數是由您正則表達式匹配整個字符串(捕獲組並不重要,因此它成爲{name})。

第二,第三,第四等參數是你的捕獲組,因爲你只有一個,你的第二個參數變成name

最後兩個參數是匹配的位置和整個字符串。如果您願意,可以從回調中省略這些參數。

這是你的代碼的一個稍微更可讀的版本,佔中不存在在你的置換對象的屬性:

var replace = function(string, object) { 
    return string.replace(/\{(.*?)\}/g, function(match, group) { 
     return group in object ? object[group] : match; 
    }); 
}; 

演示:http://jsfiddle.net/KeHdU/4/

+0

所以大括號不是捕獲組的一部分(因此不包含在參數b中),因爲它們不在括號內? – BrainLikeADullPencil

+0

@BrainLikeADullPencil:是的。圓括號包括您想要捕捉的所有內容。你可以有多組圓括號。 – Blender

+0

@BrainLikeADullPencil:這是一個快速演示。它應該是有幫助的:http://jsfiddle.net/KeHdU/5/ – Blender

0

如果參數的最大數量ISN沒有用過,他們被忽略了。但是如果函數中的參數被引用並且未經過第一次未定義的測試,腳本將會出錯。

0

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/replace如何使用替代功能

function replacer(match, p1, p2, p3, offset, string){ 
    // p1 is nondigits, p2 digits, and p3 non-alphanumerics 
    return [p1, p2, p3].join(' - '); 
}; 

匹配:是整個匹配的子(即什麼相匹配的正則表達式)

P1,P2 ....PN:是The nth parenthesized submatch string(你匹配的子內)

偏移:在原始字符串偏移

字符串:輸入字符串

你的情況,你沒有提供完整的參數

s.replace(a, b /*, offset, string*/) 

so a=match and b=p1

**請注意,如果第一個參數中的正則表達式是全局的,則將爲每個要被替換的完整匹配調用多次函數。

所以每場比賽都以{開頭並以}結尾,並且您有1個捕捉括號內的內容的圓括號。此外,由於使用的是全局匹配/ {([^ {}] *)} /g

因此,功能與以下參數調用兩次在2個匹配:

  1. 「{名稱} 」, '名',7, '你好,{名}歡迎{場所}'
  2. '{地點}', '地方',25, '您好,{名}歡迎{場所}'

並且整個匹配(即第一個參數)被替換爲函數的返回值