Frage

C#:Was ist ein guter Regex zum Parsen von Hyperlinks und ihrer Beschreibung?

Bitte berücksichtigen Sie die Groß-/Kleinschreibung, Leerzeichen und die Verwendung von einfachen Anführungszeichen (anstelle von doppelten Anführungszeichen) um das HREF-Tag.

Bitte denken Sie auch darüber nach, Hyperlinks zu erhalten, die andere Tags enthalten <a> Tags wie <b> Und <i>. ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

War es hilfreich?

Lösung

Solange keine verschachtelten Tags (und keine Zeilenumbrüche) vorhanden sind, funktioniert die folgende Variante gut:

<a\s+href=(?:"([^"]+)"|'([^']+)').*?>(.*?)</a>

Sobald verschachtelte Tags ins Spiel kommen, sind reguläre Ausdrücke nicht mehr für das Parsen geeignet.Sie können sie jedoch weiterhin verwenden, indem Sie erweiterte Funktionen moderner Interpreter anwenden (abhängig von Ihrer Regex-Maschine).Z.B.Reguläre .NET-Ausdrücke verwenden einen Stapel.Ich habe das gefunden:

(?:<a.*?href=[""'](?<url>.*?)[""'].*?>)(?<name>(?><a[^<]*>(?<DEPTH>)|</a>(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:</a>) 

Quelle: http://weblogs.asp.net/scottcate/archive/2004/12/13/281955.aspx

Andere Tipps

Sehen Sie sich dieses Beispiel von an Paketüberfluss:Regulärer Ausdruck zum Parsen von Links von einer Webseite?

Benutzen Das HTML Agility Pack Sie können den HTML-Code analysieren und Details mithilfe der Semantik des HTML extrahieren, anstatt einen fehlerhaften regulären Ausdruck zu verwenden.

ich habe das gefunden aber anscheinend diese Jungs hatte einige Probleme damit.

Bearbeiten: (Es klappt!)
Ich habe jetzt meine eigenen Tests durchgeführt und festgestellt, dass es funktioniert. Ich kenne C# nicht, daher kann ich Ihnen keine C#-Antwort geben, aber ich kenne PHP und hier ist das Übereinstimmungs-Array, das ich von der Ausführung hier erhalten habe:

<a href="pages/index.php" title="the title">Text</a>

array(3) { [0]=> string(52) "Text" [1]=> string(15) "pages/index.php" [2]=> string(4) "Text" } 

ICH habe einen regulären Ausdruck Das deckt die meisten Fälle ab, obwohl ich glaube, dass es mit HTML innerhalb eines mehrzeiligen Kommentars übereinstimmt.

Es ist mit der .NET-Syntax geschrieben, sollte aber leicht übersetzbar sein.

Ich werde diesen Ausschnitt jetzt veröffentlichen, da er funktioniert. Dies ist eine weniger gierige Version der zuvor vorgeschlagenen Version.Das Original würde nicht funktionieren, wenn die Eingabe mehrere Hyperlinks hätte.Mit dem folgenden Code können Sie alle Hyperlinks durchlaufen:

static Regex rHref = new Regex(@"<a.*?href=[""'](?<url>[^""^']+[.]*?)[""'].*?>(?<keywords>[^<]+[.]*?)</a>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
public void ParseHyperlinks(string html)
{
   MatchCollection mcHref = rHref.Matches(html);

   foreach (Match m in mcHref)
      AddKeywordLink(m.Groups["keywords"].Value, m.Groups["url"].Value);
}

Hier ist ein regulärer Ausdruck, der mit den ausgeglichenen Tags übereinstimmt.

(?:""'[""'].*?>)(?(?>(?)|(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?: )

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top