2014-02-15 45 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/