Crie a expressão regular mais curta que corresponderá aproximadamente a uma URL no texto quando executada em JavaScript
Exemplo:
"some text exampley.com".match(/your regular expression goes here/);
A expressão regular precisa
- capture todos os URLS válidos para http e https.
- não se preocupe em não corresponder a strings com aparência de URL que não são realmente URLs válidos como
super.awesome/cool
- ser válido quando executado como uma regex JavaScript
Critérios de teste:
Combine:
- http://example.com
- http://example.com/
- http://example.com/super
- https://example.com/super
- example.com/super
- example.com
- example.com/su-per_duper/?add=yes&subtract=no
- example.com/archive/index.html
- twitter.com/#!/reply
- example.com/234ret2398oent/234nth
- codegolf.stackexchange.com/questions/464
- crazy.wow.really.example.com/?cat=nth%3E
- exemplo-exemplo.com
- example1.com
Não combina:
- exemplo
- muito legal
- Bom Dia
- eu posso
- Olá.
Aqui está um teste que pode ajudar a esclarecer um pouco http://jsfiddle.net/MikeGrace/gsJyr/
Peço desculpas pela falta de clareza, não havia percebido o quanto os URLs correspondentes eram terríveis.
code-golf
javascript
regular-expression
Mike Grace
fonte
fonte
\w
para tudo. Você espera referências para diferentes componentes de URL?/:/
como expressão regular e corresponder a URIs válidos e não corresponder a todos os seus exemplos na lista »Não corresponder». Desde que você siga esse caminho, é simplesmente a pergunta: qual é a expressão regular mais curta que não corresponde a nenhuma das seqüências de exemplo, mas ainda captura todos os URIs.Respostas:
não corresponde a 3 strings que não deveria, corresponde a quase qualquer outra coisa;)
upd: ainda não corresponde a todos os 5
fonte
Este funciona:
Passa nos testes em http://jsfiddle.net/9BYdp/1/
Também corresponde:
fonte
http://user:[email protected]/path
Obviamente, isso não faz o que você pretende, mas atende aos seus critérios:
"corresponde a todos os URLS válidos para http e https."
sim, definitivamente corresponderá.
"não se preocupe em não corresponder a strings com aparência de URL que não são realmente válidas como 'super.awesome / cool'"
Sim, claro, haverá muitos falsos positivos, mas você disse que isso não importa.
ser válido quando executado como uma regex JavaScript
Certifique-se de que os ovos funcionem como você diz.
Se esse resultado NÃO for a resposta certa, você precisará ser mais seletivo com seus critérios.
Para ser uma regra que funcione como você pretende, você realmente faz necessidade de implementar um matcher totalmente compatível com RFC, e uma correspondência totalmente compatível com RFC irá "se preocupar em não correspondência".
Portanto, em termos de "permissão não correspondente", você precisa especificar exatamente quais desvios da RFC são permitidos.
Qualquer outra coisa, e todo esse exercício é uma farsa, porque as pessoas simplesmente escrevem o que funciona para elas, ou como elas gostam, e sacrificam "fazer algum sentido" em favor de serem curtas (como eu fiz).
Na sua atualização
O regex mais ingênuo que posso encontrar que corresponde (e captura) todos os seus exemplos colados até agora é:
É de natureza bastante simples e assume apenas 3 formas básicas possíveis.
z
pode ser algo não espaço em branco.x
pode ser qualquer coisa que não seja um espaço em branco.y
pode ser qualquer coisa que não seja um espaço em branco ou um caractere '/'.Há muitas coisas que serão válidas para esta regra, muitas, mas elas pelo menos parecerão um URI válido para um ser humano, elas simplesmente não serão compatíveis com as especificações.
por exemplo:
Acho que a abordagem sensata é extrair coisas que provavelmente são URIs e validá-las com algo mais rigoroso. Estou pensando em como usar a classe URI dos navegadores para validá-las =).
Mas você pode ver o raciocínio acima trabalhando neste exemplo aqui: http://jsfiddle.net/mHbXx/
fonte
/:/
mesmo após a edição :-)Tente isso.
Estou incluindo as barras iniciais e finais que delimitam a expressão regular, então espero que isso não prejudique minha contagem de caracteres!
Esse padrão limita o protocolo a http ou https, permite um número de porta opcional e, em seguida, permite qualquer caractere, exceto o espaço em branco.
fonte