2016-12-02 28 views
0

我只想用它的可用值替換標籤。如何通過在JavaScript中使用Preg_match來獲取字符串中的匹配數?

但是在一個字符串中可能有多個相同的標籤。

所以我需要獲取和替換,

陣列樣品

var result = { 
    '[name]':'user_name', 
    '[age]':29 
}; 

字符串

<p id="text"> 
Hi [name], I really want to thank you. 
You([name]), really done a great job. 

user, 
[name]-[age] 
</p> 

的Javascript

var text = document.getElementByID('text'); 
    text.replace(string, value); // this replacement only helps first hit. 

在這裏,我使用「[名稱]」3次,我有重置價值。

但我不能使用「.replace()」函數,因爲它不會在第二個標記(如果相同)上工作。

可能嗎?

或任何其他解決方案來解決這個問題?

在此先感謝。

+0

'REPLACE()'只替換一次出現。改用RexExp。 –

+0

是的,可以更換所有標籤。這與一般的模板分辨率類似。您可以使用任何模板引擎,如車把,下劃線模板。 – sandyJoshi

回答

0

從字符串生成正則表達式並替換爲屬性值。你可以使用RegExp從字符串中生成正則表達式。

var result = { 
 
    '[name]': 'user_name', 
 
    '[age]': 29 
 
}; 
 

 
var text = document.getElementById('text').innerHTML; 
 
res = text.replace(
 
    // generate regex 
 
    new RegExp(
 
    // get all keys from object 
 
    Object.keys(result) 
 
    // iterate and escape symbols which have special meaning in regex 
 
    .map(function(v) { 
 
     return v.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&'); 
 
    }) 
 
    // join using pipe symbol and set global modifier 
 
    // for replacing all occurenece 
 
    .join('|'), 'g'), 
 
    // use callback to replace with value in object 
 
    function(m) {   
 
    // get value from object if exist or return the same if not found 
 
    return result[m] || m; 
 
    }); 
 

 
console.log(res);
<p id="text"> 
 
    Hi [name], I really want to thank you. You([name]), really done a great job. user, [name]-[age] 
 
</p>


參見:Converting user input string to regular expression

其他方法參考:

  1. Object.keys
  2. Array#map
  3. Array#join
  4. String#replace

UPDATE:如果圖案是相同的,然後使用一個簡單的模式匹配正則表達式,並使用回調函數代替。

var result = { 
 
    '[name]': 'user_name', 
 
    '[age]': 29 
 
}; 
 

 
var text = document.getElementById('text').innerHTML; 
 
res = text.replace(/\[\w+\]/g, function(m) { 
 
    // get value from object if exist or return the same if not found 
 
    return result[m] || m; 
 
}) 
 

 
console.log(res);
<p id="text"> 
 
    Hi [name], I really want to thank you. You([name]), really done a great job. user, [name]-[age] 
 
</p>

+1

謝謝Q ... 其工作正常... –

+0

我寧願建議捕捉模式[[]]'並在回調函數中替換值 – Rajesh

+0

@Rajesh:如果模式是相同的那麼這將是更好....我剛剛添加了一個通用的解決方案... –

-2

要在JavaScript中替換多次,您可以使用RegExp替換。

var text = document.getElementByID('text'); 
var regex= new RegExp(string,'gmi'); // g: global, m: multiline, i: ignore case 
text.replace(regex, value); 
-1

甚至更​​簡單...這是[name]一個例子,你會根據需要添加字符串和價值。

var text = document.getElementById('text').textContent; 
text.replace(/\[name\]/g, 'Hello'); 
1

您可以使用一個正則表達式捕獲您的模式,然後使用將從對象中獲取值的函數。

var str = document.getElementById('text').innerHTML; 
 
var result = { 
 
    '[name]': 'user_name', 
 
    '[age]': 29 
 
}; 
 
var reg = /(?:^|\[)(.*?)(?:}|\])/g 
 
str = str.replace(reg, function(s) { 
 
    // if key exists in object, replace its value, do not replace anything 
 
    return result[s] || s; 
 
}) 
 

 
console.log(str)
<p id="text"> 
 
    Hi [name], I really want to thank you. You([name]), really done a great job. user, [name]-[age]. This is a [dummy] test case 
 
</p>

相關問題