Schneide die URL von der Zeichenkette ohne Regex ab

Gibt es einen allgemeinen Algorithmus, um URLs von einer Zeichenfolge zu trennen?

Beispielsweise:

 string1 = "bla bla bla http://bla.domain.com more blah blah nohttp.domain.with.no.protocol more text bla bla"
 (string2, urls) = wild_magic_appears(string1)
 string2 = "bla bla bla  more blah blah  more text bla bla"
 urls = ["http://bla.domain.com", "nohttp.domain.with.no.protocol"]

Ich weiß, dass Regex die beste Lösung dafür ist, aber ich interessiere mich für Nicht-Regex-Lösung

0
Sie könnten die Zeichenfolge in Wörter aufteilen (auf "teilen") und jedes Wort einzeln betrachten. Wie wild die Magie sein wird, hängt davon ab, was du anpassen willst, z. Die einfachste Anforderung wäre "jedes Wort, das mit http: //, https://beginnt oder mehr als einen Punkt enthält".
hinzugefügt der Autor CompuChip, Quelle

3 Antworten

In C# können Sie das für URLs tun, die mit "http: //" beginnen

string str1 = "bla bla bla http://bla.domain.com more blah blah nohttp.domain.with.no.protocol";
string [] array = str1.Split(' ');
Listr urls= new List();

foreach(var s in array)
{
   if(s.StartsWith("http://"))//you can add here other conditions that match url
     urls.Add(s);
}
0
hinzugefügt
Ziemlich einfach. Für diejenigen, die eine Lösung für diese Frage suchen, schlage ich vor, URLs nach Protokollnamen, Punkten und einer Liste von Top-Level-Domains (wie ich) zu erkennen.
hinzugefügt der Autor ov7a, Quelle

Ruby, Split Colon und Leerzeichen.

Nur für URLs beginnt mit http://und Ihr String-Teil hat keinen Doppelpunkt.

>a = "bla bla bla http://bla.domain.com more blah blah nohttp.domain.with.no.protocol more text bla bla"
>a.split(":")[0].to_s[-4..-1] + ":" + a.split(":")[1].split()[0].to_s
=> "http://bla.domain.com"

Für URLs mit nur Punkten. Ich kann mir keine gute Lösung vorstellen.

0
hinzugefügt
Dies ist eine ziemlich enge Lösung. Dies ist keine großartige Lösung für Benutzertexte mit ':'.
hinzugefügt der Autor ov7a, Quelle

Denken Sie an eine neue Lösung. Nur um "http: //" oder "https: //" zu teilen. Dieser ist besser mit dem Doppelpunkt des Benutzers umzugehen.

>a = "bla bla bla http://bla.domain.com more blah blah nohttp.domain.with.no.protocol more text bla bla"
>("http://"+a.split("http://")[1].to_s).split()[0]
=>"http://bla.domain.com"
0
hinzugefügt