Expresie regulată pentru parsarea unor linkuri dintr-o pagină web?

Căut o expresie regulată .NET extrage toate URL-urile dintr-o pagină web, dar nu am găsit unul care să fie suficient de cuprinzător pentru a acoperi toate modurile diferite pe care le puteți specifica un link.

Și o întrebare laterală:

Există o regex pentru a le guverna pe toți ? Sau sunt mai bine să folosesc o serie de expresii regulate mai puțin complicate și doar să folosesc mutliple passes împotriva HTML brut? (Viteză vs. mentenabilitate)

0
fr hi bn
adăugat autor RCIX, sursa

9 răspunsuri

din biblioteca RegexBuddy:

URL: Găsiți în textul complet

Clasa de caractere finală vă asigură că dacă o adresă URL face parte dintr-un anumit text, punctuația, cum ar fi o virgulă sau o oprire completă, după ce adresa URL nu este interpretată ca parte a URL-ului.

\b(https?|ftp|file)://[[email protected]#/%?=~_|!:,.;]*[[email protected]#/%=~_|]

0
adăugat

URL-ul lui? Ca și în imagini / script-uri / CSS / etc?

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

0
adăugat

Toate HTTP-urile și MAILTO-urile

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

Toate linkurile, inclusiv cele relative, care sunt numite de href sau src.

#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

Cel de-al doilea va obține doar link-uri care utilizează citate duble, totuși.

0
adăugat

Nu am timp să încerc să mă gândesc la un regex care probabil că nu va funcționa, dar am vrut să vă spun că ar trebui să vă distrugeți cu siguranță regex-ul, cel puțin dacă ajunge la acest nivel de urât :

(?:(?:\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*)

(se presupune că se potrivește cu adresele de e-mail)

Editează: Nu pot chiar să se potrivească la un post este atât de urât ....

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

I took this from regexlib.com

[nota editorului: {1} nu are nici o funcție reală în acest regex; vezi acest post ]

0
adăugat

Cu ajutorul Html Agility Pack , puteți utiliza:

HtmlDocument doc = new HtmlDocument();
doc.Load("file.htm");
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//[email protected]")
{
Response.Write(link["href"].Value;
}
doc.Save("file.htm");
0
adăugat
Eroare de sintaxă pe linia 5
adăugat autor anonymous coward, sursa

Uită-te la caietul de sarcini URI. Asta te-ar putea ajuta foarte mult. Și în ceea ce privește performanța, puteți extrage destul de mult toate legăturile HTTP într-o pagină web modestă. Când spun modest, cu siguranță nu înseamnă o pagină care cuprinde toate manualele HTML, cum ar fi manualul ELisp. De asemenea, performanța este un subiect sensibil. Sfatul meu ar fi să vă măsurați performanța și apoi să decideți dacă doriți să extrageți toate linkurile utilizând o singură regex sau cu mai multe expresii simple mai simple.

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

0
adăugat

Acest lucru va capta URL-uri de la toate etichetele, atâta timp cât autorul citate HTML utilizate:

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

Am făcut un exemplu aici .

0
adăugat

according to http://tools.ietf.org/html/rfc3986

extragerea urlului din orice text (nu numai HTML)

(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)
0
adăugat
Se vor potrivi adresele URL care încep cu https: // sau ftp: //?
adăugat autor andrewsi, sursa