Hilfe Hacking Grubers Liberal URL Regex
Frage
ich getroffen habe die Liberal URL Regex von Daring Fireball , fusionierte sie mit einige von Alan Sturm Verbesserungen und gehackt mich in einige Fehler wie die Unterstützung für IDN Zeichen in Klammern fixiert. Dies ist, was ich habe:
/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
Allerdings habe ich einen Fehler gestoßen, dass ich nicht in der Lage bin zu sein zu lösen:
'www.dsd(sd)sdsd.com' // can also be the valid 'www.dsd.com/whatever(whatever)'
Die obige URL wird als www.dsd(sd)sdsd.com'
(oder www.dsd.com/whatever(whatever)'
) statt www.dsd(sd)sdsd.com
(oder www.dsd.com/whatever(whatever)
) anerkannt. Dies scheint nur zu geschehen, wenn die URL Klammern hat, da die folgende URL:
'www.sampleurl.com'
korrekt als www.sampleurl.com
erkannt zu werden.
Ich denke die [^[:punct:]\s]|\/
Teil der Regex nicht ausgeführt wird, wenn die URL hat Klammern , ich habe seit einiger Zeit versucht, aber ich kann nicht eine Lösung zu finden scheinen. Kann mir jemand helfen?
Für Ware, ich habe eine Rubular permalink mit dem regex einrichten und einige Testdaten (die letzte URL fehlschlägt).
Ich denke, dass Gruber regex ein wenig gehetzt, zum Beispiel ist es nicht übereinstimmt URL wie:
http://en.wikipedia.org/wiki/Something_(Special)_For_You
Ich bin noch mehr beeindruckt von zu sehen, dass beide Gruber und Alan diese wirklich einfacher Tippfehler verpasst:
\([\w\d]+\)
Würde \(\w+\)
nicht genug? : S
Lösung
Scheint, wie Gruber überarbeitet hat seinen regulären Ausdruck :
\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.])(?:[^\s()<>]+|\([^\s()<>]+\))+(?:\([^\s()<>]+\)|[^`!()\[\]{};:'".,<>?«»“”‘’\s]))
Andere Tipps
www.dsd (sd) sdsd.com ist kein gültiger Domain-Namen.
Wenn Sie 'www.dsd.com/whatever(whatever)'
hätten, wäre es richtig erkannt werden. (Oder zumindest in meinen Tests)
/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
www. | | |
dsd | |
(sd) |
sdsd.com'
Das ist, wie ich denke, das zusammenbricht ... das Bit der Regex oben (sd)
beginnt mit einem entflohenen offenen paren, dann ein Starrte char Klasse passende sd
, dann ein entflohener Schließung paren, und das nächste, was ist [^\s()<>]*
die sdsd.com'
Spiele .