2014-01-17 27 views
3

我有一個字符串,它看起來像這樣:JavaScript的正則表達式捕獲並更換

var whereClause = "p_id eq @[email protected] and idr_user_id eq @[email protected]"; 

我有以下的正則表達式來捕獲令牌 /(@ \ w + @)/ G

我會喜歡能夠用不同的值代替每個事件,如

whereClause.replace(/(@\[email protected])/g, projectID, userID); 

這項工作?任何意見將是有益......

+0

你正在公開一個where子句被客戶端操縱嗎?聽起來像是一個等待發生的安全問題。 – adam0101

+0

@ adam0101,where子句由從sqlLite數據庫查詢而不是人爲輸入的值填充。 – gdex

+1

這不起作用。 JS替換方法只需要2個參數。任何其他參數都將被忽略。您必須創建一個RegExp對象,對該字符串運行正則表達式,然後遍歷匹配。 – Bic

回答

6

你可以瞄準的是這樣的:

template(string, {key: value, key: value}); 

它可以在使用replace回調幾行來實現:

function template(text, obj) { 
    var regex = /@(\w+)@/g; 
    return text.replace(regex, function(_, match) { 
    return obj[match] || _; 
    }); 
} 

// Usage: 
var str = 'p_id eq @[email protected] and idr_user_id eq @[email protected]'; 
var result = template(str, {p_id: 123, idr_user_id: 'ABC'}); 
//^ "p_d eq 123 and idr_user_id eq ABC" 

如果您需要不同的正則表達式或結構,你可以創建一個簡單的關閉,如:

function template(regex, fn) { 
    return function (text, obj) { 
    return text.replace(regex, function(_, match) { 
     return fn.call(obj, match); 
    }); 
    } 
}; 

// Using an array 
var myTemplate = template(/%(\d+)/g, function(x) { 
    return this[--x]; 
}); 
var str = 'Hello %1, foo %2'; 
var result = myTemplate(str, ['world', 'baz']); 
//^ "Hello world, foo baz" 
+0

如果不在地圖中的令牌不應該被替換,你可以執行'return obj [match] || _;' –

+0

@FelixKling:好點。 – elclanrs

0

我做了一些有點類似於此之前的動態錯誤信息。要做到這一點,你會這樣做。

function populateMessage(messageTemplate, replacementVals) { 
    var newMessage = messageTemplate; 

    for (var targetVal in replacementVals) { 
     if (replacementVals.hasOwnProperty(targetVal)) { 
      newMessage = newMessage .replace("@" + targetVal + "@", replacementVals[targetVal]); 
     } 
    } 

    return newMessage; 
} 

var whereClause = "p_id eq @[email protected] and idr_user_id eq @[email protected]"; 
var replacementText = {"p_id": "SOME_TEXT_1", "idr_user_id": "SOME_TEXT_2"}; 
var outputValue = populateMessage(whereClause, replacementText); 

這種做法的利弊的一個是,你可以使用不同的whereClausereplacementText變量,針對不同的情況,如果發現.replace爲定義的鍵匹配替換纔會發生。所以:

var whereClause1 = "p_id eq @[email protected] and idr_user_id eq @[email protected]"; 
var whereClause2 = "p_id eq @[email protected]"; 
var whereClause3 = "idr_user_id eq @[email protected]"; 

。 。 。都可以通過以下方式「服務」:

var replacementText = {"p_id": "SOME_TEXT_1", "idr_user_id": "SOME_TEXT_2"}; 

。 。 。並生成有效的消息。

如果需要的話,使用動態值填充replacementText對象也是非常容易的。