2017-06-13 8 views
1

Ich versuche, eine Regex zu erstellen, die eine Abschrift URLs übereinstimmen, aber den Inhalt ignorieren, der davor und danach kommt. Es sollte nur lokale Abzeichnungs-URLs enthalten, die auf lokale Dateien verweisen und solche ignorieren, die auf externe Websites verweisen. Beispiel:Regex zu lokalen Markdown-Links

"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"

nur Sollte die zweite Verbindung übereinstimmen. Derzeit passt es alles zusammen. Mein Regex funktioniert für das, was ich brauche, aber das scheint der wichtigste Fall zu sein, den ich gefunden habe.

Was ich habe, so weit:

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

Derzeit ignoriert dies die erste Verbindung und stimmt mit dem zweiten Link, wenn die zweite Verbindung nicht nach der ersten Verbindung kommt. Ansonsten passt es alles vom ersten bis zum zweiten.

Ich benutze JavaScript, das negative Lookbehinds nicht unterstützt. Irgendwelche Vorschläge?

+0

Haben Sie eine lokale URLs aufnehmen möchten oder einfach nur testen, ob vorhanden ? –

+0

Ich hatte einige Regeln zum Ignorieren von "http", ".com" usw. von der URL, dieser Teil muss nicht strenger sein für das, was ich mache. https://regex101.com/r/p6W9iE/1 < Ich mag würde, diese Arbeit zu machen, damit es den zweiten Link nur und dank @Sin passt, aber hat nicht funktioniert – ceckenrode

+0

Ok, das dann '((!? \ [[^ \]] *? \]) \ ((? :(?! http | www \. | \ # | \ .com | \ .net | \ .info | \ .org).) *? \)) ' – sln

Antwort

1

Es gibt zwei Probleme.

  1. Diese \[.*?\] wird die Luft sprengen Vergangenheit ] und Spiel [link which should be ignore](http://google.com/) lorem ipsum lorem ips sum loreerm [link which shouldn't be ignored] nur, damit er die Behauptungen übereinstimmen.
  2. Die Assertions sind unbegrenzt.

können Sie fix 1 & 2 mit dieser Regex

((!?\[[^\]]*?\])\((?:(?!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) 

Metrics

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

Capture Groups  = 2 

Assertions   = 1 
     (? !  = 1 

Free Comments  = 7 
Character Classes = 1 
+1

Dies löst mein Problem, danke für die Antwort und Erklärung! – ceckenrode

1

Prüfung, ob eine URL l ocal oder extern ist nicht ein Job für Regex. Wie Sie mit dem dritten Link in der Beispielzeichenfolge sehen können, testen Sie, ob die URL .org, .com, http, # oder was auch immer falsch ist.

Dieser Code zeigt, wie Sie wissen, ob eine URL in einem Ersatz-Kontext auf Client-Seite lokal oder nicht ist:

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

Danke für die Eingabe, und ich stimme zu, aber ich benutze diesen Code nicht in einem Browser. Mit einer lokalen Markdown-Datei müssen Sie ein http: // oder https: // - Präfix angeben, um zu versuchen, auf das Web zuzugreifen, also könnte ich wahrscheinlich nur darauf reduzieren. – ceckenrode