Vra

Ek is op soek na 'n .NET-reëlmatige uitdrukking onttrek al die URL's van 'n webblad, maar het nie een gevind wat omvattend genoeg is om al die verskillende maniere te dek waarop jy 'n skakel kan spesifiseer nie.

En 'n byvraag:

Is daar een regex om hulle almal te regeer?Of is ek beter daaraan toe om 'n reeks minder ingewikkelde gereelde uitdrukkings te gebruik en net meervoudige passe teen die rou HTML te gebruik?(Spoed vs.Onderhoubaarheid)

Was dit nuttig?

Oplossing

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

Ek het hierdie van regexlib.com

[redakteur se nota:die {1} het geen werklike funksie in hierdie regeks nie; sien hierdie pos]

Ander wenke

van die RegexBuddy-biblioteek:

URL:Vind in volledige teks

Die finale karakterklas maak seker dat as 'n URL deel is van een of ander teks, leestekens soos 'n komma of punt na die URL nie as deel van die URL geïnterpreteer word nie.

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

Met Html Agility Pack, jy kan gebruik:

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");

Kyk na die URI-spesifikasie.Dit kan jou baie help.En wat prestasie betref, kan jy byna al die HTTP-skakels op 'n beskeie webblad onttrek.As ek beskeie sê, bedoel ek beslis nie een bladsy wat almal HTML-handleidings soos dié van ELisp-handleiding bevat nie.Ook prestasie is 'n raak onderwerp.My raad sal wees om jou prestasie te meet en dan te besluit of jy al die skakels gaan onttrek deur een enkele regex of met veelvuldige eenvoudiger regex-uitdrukkings te gebruik.

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

Alle HTTP's en MAILTO's

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

Alle skakels, insluitend relatiewe, wat deur href of src geroep word.

#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

Die tweede een sal egter net skakels kry wat dubbele aanhalings gebruik.

Ek het nie tyd om te probeer dink aan 'n regex wat waarskynlik nie sal werk nie, maar ek wou kommentaar lewer dat jy beslis jou regex moet opbreek, ten minste as dit hierdie vlak van lelikheid:

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

(dit stem glo ooreen met e-posadresse)

Wysig:Ek kan dit nie eers op een post inpas nie dis so vieslik....

Dit sal die URL's van al 'n merkers vasvang solank die skrywer van die HTML gebruik aanhalings:

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

Ek het 'n voorbeeld gemaak hier.

URL's?Soos in beelde/skrifte/css/ens.?

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

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

onttrek url uit ENIGE teks (nie net HTML nie)

(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top