2009-04-30 4 views
3

Ich muss eine Suche und ersetzen Sie auf langen Textzeichenfolgen. Ich möchte alle Instanzen defekte Links zu finden, die wie folgt aussehen:C# Regex zu finden und zu ersetzen Wiederverwendung Teil des übereinstimmenden Textes

<a href="http://any.url.here/%7BlocalLink:1369%7D%7C%7CThank%20you%20for%20registering">broken link</a> 

und beheben, so dass es wie folgt aussieht:

<a href="/{localLink:1369}" title="Thank you for registering">link</a> 

Es kann im Text eine Reihe dieser defekte Links sein Feld. Meine Schwierigkeit besteht darin, herauszufinden, wie man die passende ID (in diesem Fall 1369) wiederverwenden kann. Im Inhalt ändert sich diese ID von Link zu Link, ebenso wie die URL und der Linktext.

Danke,

David

EDIT: Um zu klären, ich C# -Code schreibe durch Hunderte von langen Textfeldern laufen in ihnen defekte Links zu beheben. Jedes einzelne Textfeld enthält HTML, das eine beliebige Anzahl von defekten Links enthalten kann - die Regex muss sie alle finden und durch die korrekte Version des Links ersetzen.

+0

Möchten Sie das Tag auch übereinstimmen, oder möchten Sie nur die Regex auf den Inhalt des href-Attributs anwenden? – Lucero

+0

Ich möchte nur das falsche href-Attribut in der ersten out, so dass es die richtigen href und Titel Attribute wird. Es macht mir nichts aus, wie das passiert :) @tanascius - Ich kodiere dies in C#. –

+0

Ich habe meine Regex korrigiert, bitte versuchen Sie es erneut. – Tomalak

Antwort

2

Nehmen Sie diese mit einem Körnchen Salz, HTML und Regex spielen nicht gut zusammen:

(<a\s+[^>]*href=")[^"%]*%7B(localLink:\d+)%7D%7C%7C([^"]*)("[^>]*>[^<]*</a>) 

Wenn auf Ihren Eingang und ersetzt mit

$1/{$2}" title="$3$4 

wird wie folgt hergestellt:

<a href="/{localLink:1369}" title="Thank%20you%20for%20registering">broken link</a> 

Dies ist so nah wie es nur mit Regex geht. Sie müssen MatchEvaluator delegate verwenden, um die URL-Codierung von der Ersetzung zu entfernen.

+0

Dies ist sehr nah - danke für Ihre Hilfe. Ein paar Punkte: 1. Die Regex entspricht auch richtigen Links, die ich nicht wollen 2. Es ersetzt die defekten Links, aber nicht ganz richtig, gibt es: link - Ich muss die URL.still entfernen. hier bit, auch die} || im Titelattribut. 3. Die ursprüngliche Quelle ist HTML-codiert, aber ich brauche den ersetzten Text {localLink: 1369} anstelle von% 7BlocalLink: 1369% 7D. Können Sie helfen? Danke, David –

+0

Ich habe ein paar Änderungen an meiner Regex gemacht, sollte es jetzt tun. – Tomalak

2

Ich nehme an, dass Sie bereits das Element und die Attribute analysiert haben. So die URL zu verarbeiten, so etwas wie folgt verwenden:

string url = "http://any.url.here/%7BlocalLink:1369%7D%7C%7CThank%20you%20for%20registering"; 
    Match match = Regex.Match(HttpUtility.UrlDecode(url), @"^http://[^/]+/\{(?<local>[^:]+):(?<id>\d+)\}\|\|(?<title>.*)$"); 
    if (match.Success) { 
     Console.WriteLine(match.Groups["local"].Value); 
     Console.WriteLine(match.Groups["id"].Value); 
     Console.WriteLine(match.Groups["title"].Value); 
    } else { 
     Console.WriteLine("Not one of those URLs"); 
    } 
2

Um das Spiel in der Ersatzzeichenfolge enthalten, verwenden Sie $&.

Es gibt eine Reihe weiterer Substitutionsmarker, die in der Ersetzungszeichenfolge see here for the list verwendet werden können.

1

Danke an alle für ihre Hilfe. Hier ist, was ich am Ende verwendet:

const string pattern = @"(<a\s+[^>""]*href="")[^""]+(localLink:\d+)(?:%7[DC])*([^""]+)(""[^>]*>[^<]*</a>)"; 
// Create a match evaluator to replace the matched links with the correct markup 
var myEvaluator = new MatchEvaluator(FixLink); 

var strNewText = Regex.Replace(strText, pattern, myEvaluator, RegexOptions.IgnoreCase); 

internal static string FixLink(Match m) 
    { 
     var strUrl = m.ToString(); 
     const string namedPattern = @"(<a\s+[^>""]*href="")[^""]+(localLink:\d+)(?:%7[DC])*([^""]+)(""[^>]*>[^<]*</a>)"; 
     var regex = new Regex(namedPattern); 

     //const string strReplace = @"$1/{$2}"" title=""$4"; 
     const string strReplace = @"$1/{$2}"" title=""$4"; 

     HttpContext.Current.Response.Write(String.Format("Replacing '{0}' with '{1}'", strUrl, regex.Replace(strUrl, strReplace))); 
     return regex.Replace(strUrl, strReplace); 
    } 
+1

Ich glaube, Sie haben den Einsatz des MatchEvaluators nicht verstanden. – Tomalak

Verwandte Themen