Liberal URL Regex de ajuda Hacking Gruber
Pergunta
Eu tomei a Liberal URL Regex do Daring Fireball , fusão com o algumas das melhorias Alan tempestade e cortou meu caminho para corrigir alguns erros como suporte para caracteres IDN entre parênteses. Isto é o que eu tenho:
/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
No entanto eu encontrei um bug que eu não estou sendo capaz de resolver:
'www.dsd(sd)sdsd.com' // can also be the valid 'www.dsd.com/whatever(whatever)'
O URL acima é ser reconhecido como www.dsd(sd)sdsd.com'
(ou www.dsd.com/whatever(whatever)'
) em vez de www.dsd(sd)sdsd.com
(ou www.dsd.com/whatever(whatever)
). Isso só parece acontecer quando o URL tem parênteses, desde o seguinte URL:
'www.sampleurl.com'
está corretamente sendo reconhecido como www.sampleurl.com
.
Eu acho que parte [^[:punct:]\s]|\/
do regex não está sendo executado quando o URL tem parênteses , eu tenho tentado por algum tempo, mas eu não consigo encontrar uma solução. Alguém pode me ajudar?
Para mercadoria, eu configurar um Rubular permalink com o regex e alguns dados de teste (o último URL falhar).
Eu acho que regex de Gruber foi um pouco apressado, por exemplo ele não corresponde de URL como:
http://en.wikipedia.org/wiki/Something_(Special)_For_You
Eu estou ainda mais impressionado ao ver que tanto Gruber e Alan perdeu esse erro de digitação muito simples:
\([\w\d]+\)
não iria \(\w+\)
ser suficiente? : S
Solução
Parece que Gruber revisou sua expressão regular :
\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.])(?:[^\s()<>]+|\([^\s()<>]+\))+(?:\([^\s()<>]+\)|[^`!()\[\]{};:'".,<>?«»“”‘’\s]))
Outras dicas
www.dsd (sd) sdsd.com não é um nome de domínio válido.
Se você tivesse 'www.dsd.com/whatever(whatever)'
, seria reconhecido corretamente. (Ou pelo menos está em meus testes)
/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
www. | | |
dsd | |
(sd) |
sdsd.com'
É assim que eu penso Isso quebra ... o bit do regex acima (sd)
começa com uma escaparam parêntese aberto, em seguida, um char Stared sd
correspondência classe, em seguida, um escapou fechar parêntese, ea próxima coisa que é [^\s()<>]*
que corresponde sdsd.com'
.