2016-01-22 40 views
0

我有一個這樣的字符串:如何爲字符串中的所有相同URL定義相同的數字?

var str = "this is [link1][1] 
      this is [link2][2] 

      this is [link3][3] 
      this is [link4][4] 

      [1]: http://example1.com 

      [2]: http://example2.com 
      [3]: http://example1.com 


      [4]: http://example4.com"; 

現在我想這樣的:

var str = "this is [link1][1] 
      this is [link2][2] 

      this is [link3][1] 
      this is [link4][4] 

      [1]: http://example1.com 
      [2]: http://example2.com 
      [4]: http://example4.com"; 

正如你在上面的例子中看到有兩件事情:

  1. 刪除之間的冗餘\n所有這些網址(只有網址)
  2. Remo已經重複的URL和替換refrence數(換句話說,在上面的例子中,因爲第一和第三URL是相同的,那麼[3]: http://example1.com拆卸和替換[3][1]

有一個正則表達式它匹配[any digit]:及其兩種url組:

/(\[[0-9]*]:)\s*(.*)\r?\n?/gm 

str,該正則表達式匹配:

//group1 
$1: [1]: 
    [2]: 
    [3]: 
    [4]: 

//group2 
$2: http://example1.com 
    http://example2.com 
    http://example1.com 
    http://example4.com 

也有另一個正則表達式其中僅刪除鏈接之間的所有廢物\n

str.replace(/(^\[[0-9]*]:.*)\n+/gm, $1\n); 

好了,我該怎麼辦呢?

回答

1

這可能是YOUT問題的解決方案:

function removeMultipleMatkdownLinks(markownString) { 
    var seperateLinks = /(\[[0-9]*]):\s*(.*)\r?\n?/gm; 
    var removeNewLines = /(^\[[0-9]*]:.*)\n+/gm; 

    var result; 
    var urls = [], ids = []; 
    var formattedString = str; 
    while ((result = seperateLinks.exec(str)) !== null) { 
     if (result.index === seperateLinks.lastIndex) { 
      result.lastIndex++; 
     } 
     //check if link already exists 
     var index = urls.indexOf(result[2]); 
     if(index < 0) { 
     urls.push(result[2]); 
     ids.push(result[1]); 

     } else { //remove links and replace ids 
     var removeLink = new RegExp("(\\" + result[1] + ":.*\\r?\\n?)", "gm"); ///(\[1\]:.*\n)/gm 
     var changeNumber = new RegExp("(\\" + result[1] + ")", "gm"); 
     formattedString = formattedString 
      .replace(removeLink, "") 
      .replace(changeNumber, ids[index]); 
     } 
    } 

    return formattedString.replace(removeNewLines, "$1\n"); 
} 

JSFiddle

+0

那麼輸出似乎是正確的......謝謝。 +1 – stack

相關問題