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

War es hilfreich?

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

funktioniert gut jetzt .

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top