Pergunta

Estou consumindo a API do Twitter e quero converter todos os URLs em hiperlinks.

Qual é a maneira mais eficaz que você encontrou para fazer isso?

de

string myString = "This is my tweet check it out http://tinyurl.com/blah";

para

This is my tweet check it out <a href="http://tinyurl.com/blah">http://tinyurl.com/>blah</a>
Foi útil?

Solução

Expressões regulares são provavelmente suas amigas para esse tipo de tarefa:

Regex r = new Regex(@"(https?://[^\s]+)");
myString = r.Replace(myString, "<a href=\"$1\">$1</a>");

A expressão regular para URLs correspondentes pode precisar de um pouco de trabalho.

Outras dicas

Eu fiz exatamente a mesma coisa com jquery consumindo a API JSON aqui está a função linkify:

String.prototype.linkify = function() {
    return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(m) {
        return m.link(m);
    });
 };

Na verdade, este é um problema feio.Os URLs podem conter (e terminar com) pontuação, por isso pode ser difícil determinar onde um URL realmente termina, quando está incorporado em texto normal.Por exemplo:

http://example.com/.

é um URL válido, mas poderia facilmente ser o final de uma frase:

I buy all my witty T-shirts from http://example.com/.

Você não pode simplesmente analisar até que um espaço seja encontrado, porque então você manterá o ponto final como parte do URL.Você também não pode simplesmente analisar até que um ponto ou espaço seja encontrado, porque os pontos são extremamente comuns em URLs.

Sim, regex é seu amigo aqui, mas construir o regex apropriado é a parte mais difícil.

Confira isso também: Expandindo URLs com Regex em .NET.

Você pode adicionar mais controle sobre isso usando a função de delegação MatchEvaluator com expressão regular:suponha que eu tenha esta string:

find more on http://www.stackoverflow.com 

agora tente este código

private void ModifyString()
{
    string input = "find more on http://www.authorcode.com ";
                Regex regx = new Regex(@"\b((http|https|ftp|mailto)://)?(www.)+[\w-]+(/[\w- ./?%&=]*)?");
                string result = regx.Replace(input, new MatchEvaluator(ReplaceURl));
}

static string ReplaceURl(Match m)
{
    string x = m.ToString();
    x = "< a href=\"" + x + "\">" + x + "</a>";
    return x;
}

/torce para RedWolves

de:this.replace(/[A-Za-z]+://[A-Za-z0-9-]+.[A-Za-z0-9-:%&\?/.=]+/, função(m){...

ver:/[A-Za-z]+://[A-Za-z0-9-]+.[A-Za-z0-9-:%&\?/.=]+/

Aí está o código para os endereços "anyprotocol"://"anysubdomain/domain"."anydomainextension and address",

e é um exemplo perfeito para outros usos de manipulação de strings.você pode fatiar e picar à vontade com .replace e inserir "a href" apropriados quando necessário.

Usei jQuery para alterar facilmente os atributos desses links para "target=_blank" em minha lógica de carregamento de conteúdo, embora o método .link não permita personalizá-los.

Pessoalmente, adoro adicionar um método personalizado ao objeto string para filtragem de strings em tempo real (a declaração String.prototype.linkify), mas não tenho certeza de como isso funcionaria em um ambiente de grande escala onde você tenho que organizar mais de 10 funções personalizadas do tipo linkify.Acho que você definitivamente teria que fazer outra coisa com sua estrutura de código nesse ponto.

Talvez um veterinário tropece aqui e nos esclareça.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top