2010-01-08 3 views
10

J'ai pris le Liberal URL Regex from Daring Fireball, l'ai fusionné avec some of Alan Storm improvements et ai piraté mon chemin dans la correction de quelques bogues comme le support des caractères IDN entre parenthèses. Voilà ce que j'ai:Aide Hacking URL libérale de Gruber Regex

/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/ 

Cependant, j'ai rencontré un bug que je ne suis pas en mesure de résoudre:

'www.dsd(sd)sdsd.com' // can also be the valid 'www.dsd.com/whatever(whatever)' 

L'URL ci-dessus est reconnue comme www.dsd(sd)sdsd.com' (ou www.dsd.com/whatever(whatever)') au lieu de www.dsd(sd)sdsd.com (ou www.dsd.com/whatever(whatever)). Cela ne semble se produire lorsque l'URL est entre parenthèses, depuis l'URL suivante:

'www.sampleurl.com' 

est-il correctement être reconnu comme www.sampleurl.com.

Je pense la [^[:punct:]\s]|\/ partie de la regex n'est pas en cours d'exécution lorsque l'URL est entre parenthèses, j'ai essayé pendant un certain temps, mais je ne peux pas sembler trouver une solution. Quelqu'un peut-il m'aider?

Pour la marchandise, j'ai mis en place un Rubular permalink with the regex and some test data (la dernière URL échoue).


Je pense que la regex Gruber était un peu bousculé, par exemple, il ne correspond pas URL comme:

http://en.wikipedia.org/wiki/Something_(Special)_For_You 

Je suis encore plus impressionné en voyant que les deux Gruber et Alan manqué ce vraiment simple, faute de frappe:

\([\w\d]+\) 

ne serait-\(\w+\) suffisant? : S

Répondre

1

www.dsd (sd) sdsd.com n'est pas un nom de domaine valide. Si vous aviez 'www.dsd.com/whatever(whatever)', il serait reconnu correctement. (Ou au moins est dans mes tests)

+0

Cela ne semble pas non plus fonctionner (http://www.rubular.com/regexes/12851). –

+0

Hm, c'est vrai. J'ai testé en utilisant l'expression originale de Daring Fireball (que je m'utilise). Je ne suis pas un expert en regex, donc en attendant toute autre solution, je supprimerais les améliorations d'Alan Storm (parce que je pense qu'elles sont inutiles/inutiles) –

+0

L'expression Daring Fireball ne correspond qu'à 0-9a-Z entre parenthèses. –

1
/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/ 
    www.     |    |   | 
          dsd   |   | 
              (sd)  | 
                 sdsd.com' 

Voilà comment je pense que cela tombe en panne ... le bit de l'expression rationnelle ci-dessus (sd) commence par un paren ouvert évadés, puis une classe char fixais correspondant sd, puis un échappé fermeture paren, et la prochaine chose est [^\s()<>]* qui correspond à sdsd.com'.