Alguém tem sugestões para detectar URLs em um conjunto de strings?
arrayOfStrings.forEach(function(string){
// detect URLs in strings and do something swell,
// like creating elements with links.
});
Atualização: Acabei usando esse regex para detecção de link ... Aparentemente, vários anos depois.
kLINK_DETECTION_REGEX = /(([a-z]+:\/\/)?(([a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(:[0-9]{1,5})?(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)(\s+|$)/gi
O ajudante completo (com suporte opcional ao guidão) está na essência # 1654670 .
javascript
regex
url
arbales
fonte
fonte
Respostas:
Primeiro, você precisa de uma boa regex que corresponda aos URLs. Isso é difícil de fazer. Veja aqui , aqui e aqui :
De qualquer forma, esta resposta não pretende fornecer o melhor regex, mas sim uma prova de como fazer a quebra de cadeia dentro do texto, com JavaScript.
OK, então vamos apenas usar este:
/(https?:\/\/[^\s]+)/g
Novamente, este é um mau regex . Terá muitos falsos positivos. No entanto, é bom o suficiente para este exemplo.
Então, em suma, tente:
fonte
.replace
: |text="Find me at http://www.example.com, and also at http://stackoverflow.com."
resultados de pontuação à direita em dois 404s. Alguns usuários estão cientes disso e adicionam um espaço após os URLs antes da pontuação, para evitar quebras, mas a maioria dos vinculadores que eu uso (Gmail, etherpad, phabricator) separa a pontuação final do URL.Aqui está o que eu acabei usando como meu regex:
Isso não inclui pontuação à direita no URL. A função de Crescent funciona como um encanto :) então:
fonte
urlRegex
deve ser definido foralinkify
como compilar é caro.()
em cada lista de caracteres e funciona agora.Pesquisei esse problema por um bom tempo e ocorreu-me que existe um método Android, android.text.util.Linkify, que utiliza algumas expressões bastante robustas para fazer isso. Felizmente, o Android é de código aberto.
Eles usam alguns padrões diferentes para combinar diferentes tipos de URLs. Você pode encontrá-los todos aqui: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.0_r1/android/text/util/Regex.java#Regex. 0WEB_URL_PATTERN
Se você está preocupado apenas com os URLs que correspondem aos WEB_URL_PATTERN, ou seja, URLs que estão em conformidade com a especificação RFC 1738, você pode usar isso:
Aqui está o texto completo da fonte:
Se você quiser ser realmente chique, também pode testar endereços de email. A regex para endereços de email é:
PS: Os domínios de nível superior suportados pelo regex acima estão atualizados em junho de 2007. Para obter uma lista atualizada, você deve verificar https://data.iana.org/TLD/tlds-alpha-by-domain.txt .
fonte
a-zA-Z
ehttp|https|Http|Https|rtsp|Rtsp
.Baseado na resposta Crescent Fresh
se você deseja detectar links com http: // OU sem http: // e por www. você pode usar o seguinte
fonte
Essa biblioteca no NPM parece bastante abrangente https://www.npmjs.com/package/linkifyjs
fonte
A função também pode ser aprimorada para renderizar imagens:
ou para uma imagem em miniatura vinculada a uma imagem de tamanho completo:
E aqui está a função strip () que pré-processa a sequência de texto para uniformidade, removendo qualquer html existente.
fonte
Código curto grande trabalho! ...
Resultado:-
fonte
Existe um pacote npm: url-regex , basta instalá-lo com
yarn add url-regex
ounpm install url-regex
e usar da seguinte maneira:fonte
tmp.innerText é indefinido. Você deve usar o tmp.innerHTML
fonte
tente isto:
também irá reconhecer URLs como
google.com
,http://www.google.bla
,http://google.bla
,www.google.bla
não, masgoogle.bla
fonte
Você pode usar uma regex como essa para extrair padrões de URL normais.
Se você precisar de padrões mais sofisticados, use uma biblioteca como esta.
https://www.npmjs.com/package/pattern-dreamer
fonte
(?:www\.|(?!www))
? Por que deveriawwwww.com
ser inválido?Solução orientada a objetos genéricos
Para pessoas como eu que usam estruturas como angulares que não permitem a manipulação direta do DOM, criei uma função que pega uma string e retorna uma matriz de
url
/plainText
objetos que podem ser usados para criar qualquer representação de interface do usuário que você desejar.Regex de URL
Para correspondência de URL, usei
h0mayun
regex (ligeiramente adaptado) :/(?:(?:https?:\/\/)|(?:www\.))[^\s]+/g
Minha função também descarta caracteres de pontuação do final de uma URL
.
e,
acredito que com mais frequência será uma pontuação real do que uma URL legítima finalizada (mas poderia ser! Isso não é ciência rigorosa, pois outras respostas explicam bem). regex a seguir nos URLs correspondentes/^(.+?)([.,?!'"]*)$/
.Código datilografado
fonte
Se você deseja detectar links com http: // OR sem http: // OR ftp OU outros casos possíveis, como remover a pontuação final no final, dê uma olhada neste código.
https://jsfiddle.net/AndrewKang/xtfjn8g3/
Uma maneira simples de usar isso é usar o NPM
fonte