Cortar url de cadena sin expresiones regulares

¿Hay un algoritmo común para cortar urls de alguna cuerda?

Por ejemplo:

 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"]

Sé que la expresión regular es la mejor solución para eso, pero me interesa la solución no regex

0
Puede dividir la cadena en palabras (dividir en ``) y considerar cada palabra por separado. Qué tan salvaje será la magia depende de lo que quieras emparejar, p. el requisito más simple sería "cualquier palabra que comience con http: //, https://o que contenga más de un punto".
agregado el autor CompuChip, fuente

3 Respuestas

En C#, puede hacer esto para las URL que comienzan con "http: //"

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
agregado
Bastante simple. Para aquellos que busquen una solución para esta pregunta, propongo detectar urls por nombres de protocolo, puntos y lista de dominios de nivel superior (como lo hice).
agregado el autor ov7a, fuente

Ruby, split colon y espacios.

solo para URL comienza con http://y su parte de cadena no tiene dos puntos.

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

para urls con solo puntos. No puedo pensar en una buena solución.

0
agregado
Esta es una solución bastante estrecha. Esta no es una gran solución para textos de usuario con ':'.
agregado el autor ov7a, fuente

Piensa en una nueva solución. Simplemente divide "http: //" o "https: //". Este es mejor para tratar con los dos puntos del usuario.

>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
agregado