Frage

Ich suche nach einem regulären .NET-Ausdruck, der alle URLs einer Webseite extrahiert, habe aber keinen gefunden, der umfassend genug ist, um alle verschiedenen Möglichkeiten zur Angabe eines Links abzudecken.

Und eine Nebenfrage:

Ist da ein regulärer Ausdruck, um sie alle zu regieren?Oder ist es besser, eine Reihe weniger komplizierter regulärer Ausdrücke zu verwenden und einfach mehrere Durchgänge für den Roh-HTML-Code zu verwenden?(Geschwindigkeit vs.Wartbarkeit)

War es hilfreich?

Lösung

((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)

Das habe ich übernommen regexlib.com

[Anmerkung der Redaktion:die {1} hat in dieser Regex keine wirkliche Funktion; siehe diesen Beitrag]

Andere Tipps

aus der RegexBuddy-Bibliothek:

URL:Finden Sie im Volltext

Die letzte Zeichenklasse stellt sicher, dass Satzzeichen wie Kommas oder Punkte nach der URL nicht als Teil der URL interpretiert werden, wenn eine URL Teil eines Textes ist.

\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]

Mit HTML-Agility-Paket, Sie können Folgendes verwenden:

HtmlDocument doc = new HtmlDocument();
doc.Load("file.htm");
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a@href")
{
Response.Write(link["href"].Value);
}
doc.Save("file.htm");

Sehen Sie sich die URI-Spezifikation an.Das könnte dir sehr helfen.Und was die Leistung betrifft, können Sie praktisch alle HTTP-Links einer bescheidenen Webseite extrahieren.Wenn ich „bescheiden“ sage, meine ich definitiv nicht eine Seite, die alle HTML-Handbücher umfasst, wie das ELisp-Handbuch.Auch Leistung ist ein heikles Thema.Mein Rat wäre, Ihre Leistung zu messen und dann zu entscheiden, ob Sie alle Links mit einem einzigen Regex oder mit mehreren einfacheren Regex-Ausdrücken extrahieren möchten.

http://gbiv.com/protocols/uri/rfc/rfc3986.html

Alle HTTPs und MAILTOs

(["'])(mailto:|http:).*?\1

Alle Links, auch relative, die von href oder src aufgerufen werden.

#Matches things in single or double quotes, but not the quotes themselves
(?<=(["']))((?<=href=['"])|(?<=src=['"])).*?(?=\1)

#Maches thing in either double or single quotes, including the quotes.
(["'])((?<=href=")|(?<=src=")).*?\1

Mit der zweiten Option erhalten Sie jedoch nur Links, die doppelte Anführungszeichen verwenden.

Ich habe keine Zeit, mir eine Regex auszudenken, die wahrscheinlich nicht funktioniert, aber ich wollte anmerken, dass Sie Ihre Regex auf jeden Fall auflösen sollten, zumindest wenn es dazu kommt dieses Maß an Hässlichkeit:

(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ 
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
....*SNIP*....
*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
?:\r\n)?[ \t])*))*)?;\s*)

(dies stimmt angeblich mit E-Mail-Adressen überein)

Bearbeiten:Ich kann es nicht einmal in einen Beitrag einfügen, es ist so eklig ...

Dadurch werden die URLs aller a-Tags erfasst, sofern der Autor des verwendeten HTML Folgendes zitiert:

<a[^>]+href="([^"]+)"[^>]*>

Ich habe ein Beispiel gemacht Hier.

URLs?Wie in Bildern/Skripten/CSS/etc.?

%href="(.["]*)"%

entsprechend http://tools.ietf.org/html/rfc3986

Extrahieren der URL aus JEDEM Text (nicht nur HTML)

(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top