Estou usando a função abaixo para corresponder a URLs dentro de um determinado texto e substituí-los por links HTML. A expressão regular está funcionando muito bem, mas atualmente estou substituindo apenas a primeira correspondência.
Como posso substituir todo o URL? Acho que deveria estar usando o comando exec , mas realmente não sabia como fazê-lo.
function replaceURLWithHTMLLinks(text) {
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/i;
return text.replace(exp,"<a href='$1'>$1</a>");
}
fonte
URL regexp from Component
não seja comentado, alguma explicação do que está fazendo seria útil.Autolinker.js
é comentado muito bem e tem testes. Aurlize.js
biblioteca vinculada à resposta de Vebjorn Ljosa também parece funcional e bem conservada, embora não tenha testes.Substituindo URLs por Links (Resposta ao Problema Geral)
A expressão regular na pergunta perde muitos casos extremos. Ao detectar URLs, é sempre melhor usar uma biblioteca especializada que lida com nomes de domínio internacionais, novos TLDs
.museum
, parênteses e outras pontuações dentro e no final da URL e muitos outros casos extremos. Veja a postagem de Jeff Atwood no blog The Problem With URLs para uma explicação de alguns dos outros problemas."Fazer uma expressão regular substituir mais de uma correspondência" (resposta ao problema específico)
Adicione um "g" ao final da expressão regular para ativar a correspondência global:
Mas isso apenas resolve o problema na pergunta em que a expressão regular estava substituindo apenas a primeira correspondência. Não use esse código.
fonte
Fiz algumas pequenas modificações no código de Travis (apenas para evitar redeclarações desnecessárias - mas está funcionando muito bem para as minhas necessidades, um ótimo trabalho!):
fonte
[a-zA-Z]{2,6}
deve ler algo ao longo das linhas(?:[a-zA-Z]{2,6})+
para corresponder a nomes de domínio mais complicados, por exemplo, [email protected].http://
ouwww
? Isso funcionará para esse tipo de URL?replacePattern3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim;
com estereplacePattern3 = /(\w+@[a-zA-Z_]+?(\.[a-zA-Z]{2,6})+)/gim;
que corrige o problema mailto :)Fiz algumas otimizações no
Linkify()
código de Travis acima. Também corrigi um erro em que endereços de email com formatos de subdomínio não correspondiam (por exemplo, exemplo@domínio.com.br).Além disso, alterei a implementação para criar um protótipo da
String
classe para que os itens possam ser correspondidos da seguinte maneira:Enfim, aqui está o script:
fonte
+
nomes de usuário de email, como[email protected]
. Corrigi-o com o padrão de email/[\w.+]+@[a-zA-Z_-]+?(?:\.[a-zA-Z]{2,6})+/gim
(observe os+
primeiros colchetes), mas não sei se isso quebra alguma outra coisa.Obrigado, isso foi muito útil. Eu também queria algo que vinculasse coisas que parecessem uma URL - como requisito básico, vincularia algo como www.yahoo.com, mesmo que o prefixo do protocolo http: // não estivesse presente. Então, basicamente, se "www". está presente, ele o vincula e assume que é http: //. Eu também queria que os e-mails se transformassem em mailto: links. EXEMPLO: www.yahoo.com seria convertido em www.yahoo.com
Aqui está o código que eu terminei (combinação de código desta página e outras coisas que encontrei on-line e outras que fiz sozinho):
Na segunda substituição, a parte (^ | [^ /]) está substituindo apenas www.whatever.com se ainda não tiver sido prefixado por // - para evitar a vinculação dupla se um URL já estiver vinculado na primeira substituição. Além disso, é possível que www.whatever.com esteja no início da string, que é a primeira condição "ou" nessa parte da regex.
Isso poderia ser integrado como um plug-in jQuery, como Jesse P ilustrou acima - mas eu queria especificamente uma função regular que não estivesse atuando em um elemento DOM existente, porque estou pegando o texto que tenho e adicionando-o ao DOM, e Quero que o texto seja "vinculado" antes de adicioná-lo, então passo o texto por essa função. Funciona bem.
fonte
A identificação de URLs é complicada porque eles geralmente são cercados por sinais de pontuação e porque os usuários frequentemente não usam o formulário completo do URL. Existem muitas funções JavaScript para substituir URLs por hiperlinks, mas não consegui encontrar uma que funcione tão bem quanto o
urlize
filtro na estrutura da Web baseada em Python Django. Por isso, portamos aurlize
função do Django para JavaScript:Um exemplo:
O segundo argumento, se verdadeiro, faz
rel="nofollow"
com que seja inserido. O terceiro argumento, se verdadeiro, escapa caracteres com significado especial em HTML. Veja o arquivo LEIA-ME .fonte
django_compatible
como false, ele lidará com esse caso de uso um pouco melhor.urlize
não suporta TLDs corretamente (pelo menos não a porta JS no GitHub). Uma biblioteca que lida com TLDs corretamente é o JavaScript Linkify de Ben Alman .Fiz uma alteração no Roshambo String.linkify () no emailAddressPattern para reconhecer os endereços aaa.bbb. @ Ccc.ddd
fonte
Eu procurei no google por algo mais novo e deparei com este:
demo: http://jsfiddle.net/kachibito/hEgvc/1/
Funciona muito bem para links normais.
fonte
http://example.com/folder/folder/folder/
ouhttps://example.org/blah
etc - apenas o seu formato de URL não louco que corresponderá a 95-99% dos casos de uso existentes. Estou usando isso para uma área administrativa interna, portanto não preciso de nada sofisticado para capturar casos extremos ou hashlinks.O melhor script para fazer isso: http://benalman.com/projects/javascript-linkify-process-lin/
fonte
Essa solução funciona como muitas outras e, de fato, usa o mesmo regex que um deles, no entanto, em vez de retornar uma String HTML, isso retornará um fragmento de documento que contém o elemento A e quaisquer nós de texto aplicáveis.
Existem algumas ressalvas, nomeadamente com o suporte do IE e do textContent mais antigo.
aqui está uma demonstração.
fonte
Se você precisar mostrar um link mais curto (apenas domínio), mas com o mesmo URL longo, tente minha modificação da versão do código de Sam Hasler postada acima
fonte
Reg Ex:
/(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*)/ig
Abaixo estão algumas strings testadas:
Nota: Se você não quiser passar
www
como válido, use abaixo de reg ex:/(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig
fonte
Os avisos sobre a complexidade do URI devem ser observados, mas a resposta simples para sua pergunta é:
Para substituir todas as correspondências, você precisa adicionar o
/g
sinalizador ao final do RegEx:/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi
fonte
exemplo simples
fonte
Mantenha simples! Diga o que você não pode ter, em vez do que você pode ter :)
Como mencionado acima, os URLs podem ser bastante complexos, especialmente após o '?', E nem todos começam com um 'www'. por exemplo
maps.bing.com/something?key=!"£$%^*()&lat=65&lon&lon=20
Portanto, em vez de ter uma regex complexa que não atenda a todos os casos extremos e será difícil de manter, que tal essa mais simples, que funciona bem para mim na prática.
Combine
http(s):// (anything but a space)+
www. (anything but a space)+
Onde "qualquer coisa" é
[^'"<>\s]
... basicamente uma combinação gananciosa, levando você a encontrar um espaço, cotação, colchete angular ou fim de linhaAlém disso:
Lembre-se de verificar se ele ainda não está no formato de URL, por exemplo, o texto contém
href="..."
ousrc="..."
Adicione ref = nofollow (se apropriado)
Essa solução não é tão "boa" quanto as bibliotecas mencionadas acima, mas é muito mais simples e funciona bem na prática.
fonte
A detecção correta de URL com domínios internacionais e suporte a caracteres astrais não é algo trivial.
linkify-it
A biblioteca cria regex a partir de várias condições e o tamanho final é de aproximadamente 6 kilobytes :). É mais preciso do que todas as bibliotecas, atualmente referenciado em resposta aceita.Veja a demonstração do linkify-it para verificar ao vivo todos os casos extremos e testar os seus.
Se precisar vincular a fonte HTML, você deve analisá-la primeiro e iterar cada token de texto separadamente.
fonte
Eu escrevi ainda outra biblioteca JavaScript, talvez seja melhor para você, pois é muito sensível com o mínimo possível de falsos positivos, rápida e pequena. No momento, estou mantendo-o ativamente, portanto, teste-o na página de demonstração e veja como isso funcionaria para você.
link: https://github.com/alexcorvi/anchorme.js
fonte
Eu tive que fazer o oposto e criar links html apenas na URL, mas modifiquei seu regex e ele funciona como um encanto, obrigado :)
fonte
A detecção de email na resposta do Travitron acima não funcionou para mim, então eu a estendi / substituí pela seguinte (código C #).
Isso permite endereços de email como " [email protected] ".
fonte
Após a entrada de várias fontes, agora tenho uma solução que funciona bem. Tinha a ver com escrever seu próprio código de substituição.
Resposta .
Violino .
fonte
Substitua URLs no texto por links HTML, ignore os URLs dentro de uma tag href / pre. https://github.com/JimLiu/auto-link
fonte
Aqui está a minha solução:
fonte
Experimente a função abaixo:
alert(anchorify("Hola amigo! https://www.sharda.ac.in/academics/"));
fonte
Experimente abaixo a solução
fonte