2011-07-24 126 views
0

在下面的字符串中,我想用適當的下拉菜單替換[choice:a3d]。我不確定這些選項需要在冒號後面和方形大括號之前格式化。調用基於正則表達式匹配的javascript函數

string = "operation [number] [choice:a3d] [number]"; 

我不太確定.replace函數來自哪裏,但我正在使用的代碼已導入jquery。

string.replace(/(?:\[choice\:)(\w+)(?:\])/g, choice_func); 

其中:

function choice_func(choice_lists, listname, default_opt) 
{ 
    console.log("choice_lists: "+choice_lists); // [choice:a3d] 
    console.log("listname: "+listname);   // a3d 
    console.log("default_option: "+default_opt); // 67 

    var list = choice_lists[listname]; 
    return '<span class="string ' + listname + ' autosocket"><select>' + 
    list.map(function(item) 
    { 
     if (item === default_opt){ 
      return '<option selected>' + item + '</option>'; 
     }else{ 
      return '<option>' + item + '</option>'; 
     } 
    }).join('') +'</select></span>'; 
} 

不用說,代碼失敗,出現錯誤「遺漏的類型錯誤:無法調用‘地圖’的未定義」

也是在做參數的函數來自?

不要以爲該代碼是否是正確的....

+0

的問題是有點混亂,你認爲你可以創建你想達到什麼樣的一個jsbin例子嗎? –

+0

這有幫助嗎? http://jsbin.com/asisur/edit – TechplexEngineer

+2

我建議你不要這樣寫代碼。在3年後回到此代碼時請記住我的建議。 –

回答

1

這看起來對我來說,這將是簡單的爲您只需要使用您需要使用計算替換字符串的任何代碼,然後只是使用字符串替代正則表達式函數進行替換。當您需要檢查匹配的上下文以決定替換的內容時,而不是您剛剛替換事先可以計算的內容時,正則表達式函數最適合您。它可以以這種方式工作 - 只需要這種複雜性即可。

當使用正則表達式回調函數時,回調函數獲取多個參數 - 第一個參數是匹配字符串,還有其他一些參數,這些參數被記錄爲here。然後,您必須從該函數返回一個字符串,該字符串就是您想要替換的字符串。你的功能假裝它有三個參數,它不會工作。

我建議你計算替換字符串,然後只是做一個正常的文本替換它沒有正則表達式回調函數。

如果您可以更清楚地瞭解初始字符串的內容以及您想要替換的內容,我們可以給您一些示例代碼。正如你在你的問題中所顯示的那樣,你的字符串聲明甚至沒有接近合法的javascript,並且我不清楚你想要在那個字符串中替換什麼。

的僞代碼是這樣的:

var menuStr = "xxxxxxx"; 
var replaceStr = choice_func(lists, name, options); 
menuStr = menuStr.replace(/regular expression/, replaceStr);