Aide Hacking libéral URL Regex Gruber
Question
J'ai pris la libéral URL Daring Fireball Regex de , il a fusionné avec certaines des améliorations Alan tempête et piraté mon chemin dans la fixation de quelques bugs comme le support des caractères entre parenthèses IDN à l'intérieur. Voilà ce que j'ai:
/(?:[\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 reconnu 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'adresse suivante:
'www.sampleurl.com'
est-il correctement être reconnu comme www.sampleurl.com
.
Je pense que la partie [^[:punct:]\s]|\/
du 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 me aider?
Pour marchandise, je l'ai mis en place un Rubular permalien avec le regex et certaines données de test (la dernière URL échoue).
Je pense que le regex de Gruber était un peu bousculé, par exemple, il ne correspond pas à l'URL comme ceux:
http://en.wikipedia.org/wiki/Something_(Special)_For_You
Je suis encore plus impressionné en voyant que les deux Gruber et Alan a manqué cette faute de frappe très simple:
\([\w\d]+\)
Ne serait pas \(\w+\)
suffisant? : S
La solution
On dirait que Gruber a révisé son expression régulière :
\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.])(?:[^\s()<>]+|\([^\s()<>]+\))+(?:\([^\s()<>]+\)|[^`!()\[\]{};:'".,<>?«»“”‘’\s]))
Autres conseils
www.dsd (sd) sdsd.com 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)
/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
www. | | |
dsd | |
(sd) |
sdsd.com'
Voilà comment je pense que cela tombe en panne ... le bit de regex ci-dessus (sd)
commence par une échappées paren ouvert, puis un sd
correspondant de classe char regardé fixement, puis un paren de clôture évadés, et la prochaine chose est [^\s()<>]*
qui correspond sdsd.com'
.