2014-02-15 73 views
3

如何使用數組關鍵字列表在JavaScript中分割字符串?用數組關鍵字分割Javascript字符串

var keywords = [ 'An Example', 'Test']; 

var str = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr\n"+ 
    "Test: Lorem ipsum dolor sit amet, consetetur sadipscing elitr\n"+ 
    "This is An Example Lorem ipsum dolor sit amet, consetetur sadipscing elitr\n"+ 
    "An Example Lorem ipsum dolor sit amet, consetetur sadipscing elitr"; 
  1. 我想弄清楚的每一行的HTML段落
  2. 如果有一個關鍵字出數組的開頭(!)一行,關鍵詞應該得到自己的段落和「:」應刪除(如果有的話)。

在我的例子我想:

<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr</p> 
<p>Test</p> 
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr</p> 
<p>This is An Example Lorem ipsum dolor sit amet, consetetur sadipscing elitr</p> 
<p>An Example</p> 
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr</p> 

我可憐的解決方案,現在是像

str.trim().replace(/(.*?)(\n|:)/mgi, '<p>$1</p>'); 
+0

我可以問你,爲什麼你選擇的答案@aquinas了,而不是我的嗎?我首先用幾乎相同的代碼回答他的問題。 – Toothbrush

+0

我很抱歉。我犯了一個錯誤。你的解決方案一切都很好。謝謝! – user3142695

回答

2

你可以建立從關鍵字列表正則表達式:

var result = ('<p>' + str + '</p>').replace(/\r?\n/g, '</p>\r\n<p>').replace(new RegExp('^<p>(' + keywords.map(function(x){return x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');}).join('|') + ')(?:\\:)?\\s*', 'mgi'), '<p>$1</p>\r\n<p>'); 

一個完整的示例,請參見http://jsfiddle.net/6uuXY/1/

2

這裏有一個辦法,先分成幾段,然後通過循環,檢查每個關鍵字,並將結果推回到新陣列中:

var result = []; 
var keywords = [ 'An Example', 'Test']; 
str.split('\n').forEach(function(pg) { 
    var any = false; 
    for (var keyword in keywords) { 
     var keyword = keywords[idx]; 
     if (pg.indexOf(keyword) == 0) { 
      result.push(keyword); 
      var stripped = pg.substr(keyword.length); 
      if (stripped.indexOf(": ") == 0) 
       stripped = stripped.substr(2); 
      result.push(stripped); 
      any = true; 
      break; 
     } 
     // no keyword matched -- push the paragraph unchanged 
     if (!any) result.push(pg); 
    }  
}); 

Fiddle

3
function escapeRegExp(str){ 
    return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); 
} 

reg = keywords.map(function(s){ return escapeRegExp(s) + ":?";}).join("|"); 

var result = str.split(/\n/).map(function(x) { 
    var res = x.split(new RegExp("^(" + reg + ")")); 
    return res.length==1 ? "<p>" + res[0] + "</p>" : "<p>" + res[1].replace(/:$/,"") + "</p>\n<p>" + res[2].trim(); 
}).join("\n"); 

http://jsfiddle.net/Tg3ch/