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

Foi útil?

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]))

funciona muito bem agora .

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' .

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