2017-06-13 64 views
1

我試圖創建一個匹配markdown url的正則表達式,但忽略它前後的內容。它應該只匹配指向本地文件的本地markdown url,而忽略指向外部網站的URL。例如:正則表達式匹配本地降價鏈接

"dddd [link which should be ignore](http://google.com/) lorem ipsum lorem ips sum loreerm [link which shouldn't be ignored](../../../filepath/folder/some-other-folder/another-folder/one-last-folder/file-example.html). lorem ipsum lorem"

應該僅匹配第二鏈路。目前,它匹配一切。我的正則表達式適用於我所需要的,但這似乎是我找到的主要邊緣案例。

我有什麼至今:

/(!?\[.*?\]\((?!.*?http)(?!.*?www\.)(?!.*?#)(?!.*?\.com)(?!.*?\.net)(?!.*?\.info)(?!.*?\.org).*?\))/g

目前,這忽略了第一鏈路和第二鏈路相匹配,如果第二連桿不會在第一個鏈接後到來。否則,它會匹配從第一個到第二個的所有內容。

我正在使用JavaScript,它不支持負向lookbehinds。有什麼建議麼?

+0

你想捕捉本地URL或只是測試(如果存在) ? –

+0

我有一些規則來忽略網址中的「http」,「.com」等,該部分不需要對我所做的更嚴格。 https://regex101.com/r/p6W9iE/1 < 我想使這個工作,所以它的第二個鏈接只匹配 和感謝@sin,但沒有奏效 – ceckenrode

+0

好吧,這然後'((!?\ [[^ \]] *?\])\((?????http。www。。\#| \ .com | \ .net | \ .info | \ .org。 )。)*?\))' – sln

回答

1

有兩個問題。

  1. \[.*?\]會吹過去]搭配[link which should be ignore](http://google.com/) lorem ipsum lorem ips sum loreerm [link which shouldn't be ignored]只是讓它將匹配的斷言。
  2. 斷言是無界的。

您可以修復1 & 2這個表達式

((!?\[[^\]]*?\])\((?:(?!http|www\.|\#|\.com|\.net|\.info|\.org).)*?\))

Expanded

(       # (1 start) 
     (!?\[ [^\]]*? \])   # (2), Link 
     \(       # Open paren (
     (?:       # Cluster 
      (?!       # Not any of these 
       http 
      | www\. 
      | \# 
      | \.com 
      | \.net 
      | \.info 
      | \.org 
      ) 
      .        # Ok, grab this character 
    )*?       # End cluster, do 0 to many times 
     \)       # Close paren) 
)        # (1 end) 

指標

---------------------------------- 
* Format Metrics 
---------------------------------- 
Cluster Groups  = 1 

Capture Groups  = 2 

Assertions   = 1 
     (? !  = 1 

Free Comments  = 7 
Character Classes = 1 
+1

這解決了我的問題,感謝您的答案和解釋! – ceckenrode

1

測試如果一個網址爲l ocal或external是而不是正則表達式的一個工作。正如你可以看到示例字符串中的第三個鏈接,測試uri是否包含.org.comhttp,#或其他什麼都不對。

這段代碼演示瞭如何知道如果URL是本地的還是沒有更換背景上的客戶端:

var text = '[external link](http://adomain.com/path/file.txt) ' + 
 
      '[local link](../path/page.html) ' + 
 
      '[local link](../path.org/http/file.com.php#fragment)'; 
 

 
text = text.replace(/\[([^\]]*)\]\(([^)]*)\)/g, function (_, g1, g2) { 
 
    var myurl = document.createElement('a'); 
 
    myurl.href = g2; 
 
    return window.location.hostname == myurl.hostname ? "locrep" : "extrep"; 
 
}); 
 

 
console.log(text);

+0

感謝您的輸入,我同意,但我沒有在瀏覽器中運行此代碼。 使用本地markdown文件,您需要指定一個http://或https://前綴來嘗試訪問網頁,所以我可能只是將其縮減爲該網頁。 – ceckenrode