2009-03-05 4 views
2

Ich habe an dieser RegEx für den letzten Tag oder so gearbeitet, und ich denke, ich habe es ausgearbeitet, damit es die Daten zurückgibt, die ich möchte. Zuerst ein kleiner Hintergrund.Ersetzen Sie Inhalt in einer Zeichenfolge basierend auf Regex.Matches MatchCollection

Ich habe einen Inhaltseditor, mit dem Benutzer Webseiten bearbeiten können. Sie können Text formatieren, Links hinzufügen, etc .. Standard Content-Editor Zeug. Wenn sie auf Speichern klicken, bietet der Editor die Möglichkeit, den Inhalt (editor.Content) abzurufen und in eine Zeichenfolge zu schreiben. Ich möchte Links (<a> Tags) erhalten und herausfinden, ob es sich um interne oder externe Links handelt und ob es sich um PDF-Dateien handelt.

Hier ist die Expression ich habe kommen mit:

<a\b[^<>]*href\s*=\s*[\""\'](?<domain>https?:\/\/[^\/\s\'\""]*)*\/?(?<path>\/?[^\s\""]+?)?[[>\""\'] 

Damit ich bin in der Lage, die Domain zu trennen (wenn es einen hat) und den Pfad aus. Dann habe ich eine Schleife durch die passende ...

dim matchColl as MatchCollection = Regex.Matches(editorContent, regExString) 
For Each m as Match in matchColl 
    If m.Groups("domain").value <> myInternalDomain and m.Groups("domain").value <> "" then 
     'this is an external domain... do some stuff 
    End If 
    If m.Groups("path").value.EndsWith(".pdf") then 
     'it is a pdf, do some other stuff... 
    End if 
Next 

Meine Frage ist ... die Teile, wo ich tun einige Sachen 'zu den Werten, was wäre der beste Weg sein, dass wieder zu bekommen in meinem' editorContent 'string? Ich könnte den EditorContent wahrscheinlich in einen StringBuilder einfügen und eine ganze Reihe von Ersetzungen darauf machen, aber ist das sehr effizient?

So, zum Beispiel, mit der PDF, möchte ich angeben, dass es in einem neuen Fenster geöffnet (target = "_ blank") und für die externe URL, fügen Sie einige Javascript-Code in das onclick-Attribut.

Irgendwelche Ideen wären großartig!

Danke!

+1

... [Dies ist Regex passenden HTML.] (Http://Stackoverflow.com/a/1732454/5458362) ... – Riker

Antwort

3

Ich denke, Sie wollen ein Regex.Replace tun und in einem MatchEvaluator übergeben. Grundsätzlich ist MatchEvaluator ein Delegat für eine Funktion, die eine Ersatzzeichenfolge zurückgibt.

+0

Das hat perfekt funktioniert! Ich denke nicht daran, wie mächtig RegEx's sind ... das ist großartig! – hacker