2013-03-04 20 views
1

我想寫一個函數,需要一長串文本,標識文本中的佔位符,並提示用戶提供一個值代替佔位符。對於佔位符的標記看起來類似於用於圖片或鏈接降價:用提示/回調UI的正則表達式替換

some text, some more text, ?[name][description] more text, not just commas 

namedescription是任意文本運行。當我找到這些佔位符時,我想彈出一個格式良好的對話框,使用名稱和描述,並讓用戶提供重置值。

我已經有一個很好的功能(稱爲htmlPrompt)可用,你把它一塊的HTML(用於提示的主要部分),有一個文本框,然後調用你與所提供的回調函數結果(或null如果按下取消),具有以下特徵:

function (htmlText, inputStartValue, callback) 

在此功能堵漏之前,我寫的粗糙和準備:

myText = myText.replace(/(\?\[(.+)\][ ]?(?:\n[ ]*)?\[(.+)\])/g, 
    function (wholematch, m1, m2, m3) { 
    var repValue = prompt(m2); 
    if (repValue == null) 
    { 
    return m1; 
    } 
    return repValue; 
}); 

其採用內置prompt的DOM甲基od - 在格式化方面,這對我來說確實沒有足夠的工作。

不過,我想不出在htmlPrompt堵的方式 - 它只是模擬一個模式對話框,並通過調用callback提供了最終的結果。

我也想嘗試做手工的替代品,使用從match而不是replace結果 - 但到目前爲止,我所看到的,通過match返回的值僅僅是字符串 - 他們不給你任何有用的東西(如整個文本中的匹配位置)。

或者你認爲我對此完全錯誤?整個流程我想要的是:

  • 找到每個佔位符的文本
  • 提示用戶進行更換,同時使用namedescription
  • 與提供用戶的文本替換佔位符表達式值。
+0

爲什麼不能修改htmlPrompt,以便返回輸入而不是調用回調函數? – palindrom 2013-03-04 13:24:10

+0

@palindrom - 因爲它基於模擬模式對話框的模型 - 通過在包含對話框UI的'div'後面放置一個不可編輯的窗口大小的'div',然後退出所有當前正在運行的用戶javascript並讓正常的瀏覽器事件循環運行 - 這在javascript下是相當標準的。 – 2013-03-04 13:33:51

回答

0

對於每個namedescription tupples的:

首先使用match閱讀namedesription。 提示用戶。 然後用replace來代替那些。

+0

我做了類似這樣的事情,但是使用'search'而不是max,並且將大塊文本從'before'字符串移動到''after'字符串,這樣我就不必再繼續搜索文本了,我不再新包含佔位符。 – 2013-03-07 14:47:25