Kürzeste URL-Regex-Übereinstimmung in JavaScript

16

Erstellen Sie den kürzesten regulären Ausdruck, der ungefähr einer URL im Text entspricht, wenn er in JavaScript ausgeführt wird

Beispiel:

"some text exampley.com".match(/your regular expression goes here/);

Der reguläre Ausdruck muss

  • Erfassen Sie alle gültigen URLs für http und https.
  • Machen Sie sich keine Sorgen, dass die URL nicht mit Zeichenfolgen übereinstimmt, die nicht wirklich gültige URLs sind, wie z super.awesome/cool
  • gültig sein, wenn als JavaScript-Regex ausgeführt

Prüfkriterien:

Spiel:

Nicht übereinstimmen:

  • Beispiel
  • Super cool
  • Guten Morgen
  • ich kann
  • Hallo.

Hier ist ein Test, der helfen könnte, ein bisschen zu klären http://jsfiddle.net/MikeGrace/gsJyr/

Ich entschuldige mich für die Unklarheit, ich hatte nicht bemerkt, wie schrecklich übereinstimmende URLs waren.

Mike Grace
quelle
Ahgrrrr! Ich vermisse meine Bearbeitungsrechte! Ich werde das Spiel auf eine Sprache beschränken, vielleicht solltest du es mit dieser Sprache markieren.
dmckee
Was macht ein gültiges URL-Zeichen aus? weil ich einfach \walles nutzen kann Erwarten Sie Rückverweise für verschiedene URL-Komponenten?
Ming-Tang
1
"Ein URI ist eine Folge von Zeichen aus einer sehr begrenzten Menge, dh die Buchstaben des lateinischen Grundalphabets, Ziffern und einige Sonderzeichen", so RFC 2396 .
RunnerRick
Mike: Ich denke, es gibt noch einige Klarstellungen in der Reihenfolge. So wie es jetzt aussieht, kann ich nur /:/den regulären Ausdruck verwenden und gültige URIs abgleichen und nicht alle Ihre Beispiele in der Liste »Nicht übereinstimmen« abgleichen. Solange Sie diesen Weg gehen, ist es einfach die Frage: Was ist der kürzeste reguläre Ausdruck, der keinem der Beispielstrings entspricht, aber dennoch alle URIs abfängt.
Joey
1
Versuche einfach, eine längere Herausforderung mit mehr Details zu schreiben.

Antworten:

1
/.+\.\w\w.*/

passt nicht zu 3 Strings, die es nicht sollte, passt zu fast allem anderen;)
upd: passt immer noch nicht zu allen 5

www0z0k
quelle
14

Dieser funktioniert:

var re = /(^|\s)((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi;

/*
(^|\s)                            : ensure that we are not matching an url 
                                    embeded in an other string
(https?:\/\/)?                    : the http or https schemes (optional)
[\w-]+(\.[\w-]+)+\.?              : domain name with at least two components;
                                    allows a trailing dot
(:\d+)?                           : the port (optional)
(\/\S*)?                          : the path (optional)
*/

Besteht die Tests unter http://jsfiddle.net/9BYdp/1/

Stimmt auch überein mit:

  • example.com. (hinterer Punkt)
  • example.com:8080 (Port)
Arnaud Le Blanc
quelle
Süße!!!!!!!
Mike Grace
2
Möchten Sie nicht auch einen Hostnamen mit nur einer Komponente abgleichen (z. B. localhost)?
RunnerRick
Dies ermöglicht Leerzeichen
Brenjt
funktioniert bei mir. ty :)
STAHL
Funktioniert gut, aber nicht für Domains mit Benutzer / Passwort-Teilen, zBhttp://user:[email protected]/path
Radon8472
5

Dies entspricht natürlich nicht Ihren Vorstellungen, entspricht jedoch Ihren Kriterien:

 /.*/
  • msgstr "stimmen mit allen gültigen URLs für http und https überein."

    Ja, wird definitiv passen.

  • "Keine Sorge, dass die URL nicht mit Zeichenfolgen übereinstimmt, die nicht wirklich gültig sind, wie" super.awesome / cool "."

    Ja, sicher, es wird viele falsche Positivmeldungen geben, aber Sie sagten, das ist egal.

  • gültig sein, wenn als JavaScript-Regex ausgeführt

    sicher, wie Eier funktionieren, wie Sie es sagen sollten.

Wenn dieses Ergebnis NICHT die richtige Antwort ist, müssen Sie mit Ihren Kriterien selektiver vorgehen.

Um eine Regel zu sein , dass Werke , wie Sie beabsichtigen, die Sie tatsächlich tun Notwendigkeit , eine vollständige RFC - konformen Matcher, und eine vollständige RFC - konformen Matcher wird „Sorge um nicht passende“ zu implementieren.

In Bezug auf "Nicht übereinstimmende zulassen" müssen Sie daher genau angeben , welche Abweichungen von RFC zulässig sind.

Alles andere und diese ganze Übung ist eine Täuschung, weil die Leute einfach schreiben, was auch immer für sie funktioniert oder wie sie es mögen, und "irgendeinen Sinn ergeben" dafür opfern, kurz zu sein (wie ich es getan habe).

Bei deinem Update

Der naivste Regex, den ich finden kann, um all Ihre bisher eingefügten Beispiele zu vergleichen (und festzuhalten), ist:

/(\S+\.[^/\s]+(\/\S+|\/|))/g;

Es ist von Natur aus recht einfach und nimmt an, dass nur drei Grundformen möglich sind.

x.y
x.y/
x.y/z 

zkann nichts anderes sein als Leerzeichen. xkann alles sein, kein Leerzeichen. ykann alles sein, was weder ein Leerzeichen noch ein '/' Zeichen ist.

Es gibt eine Menge Dinge, die für diese Regel gültig sind, viele, aber sie sehen für einen Menschen zumindest wie eine gültige URI aus, sie sind einfach nicht mit den Spezifikationen kompatibel.

z.B:

hello.0/1  # valid 
1.2/1 # valid 
muffins://¥.µ/€  # probably valid

Ich denke, der vernünftige Ansatz besteht darin, Dinge zu extrahieren, die wahrscheinlich URIs sind, und sie dann mit etwas Strengeren zu validieren.

Die obigen Überlegungen zu diesem Beispiel finden Sie hier: http://jsfiddle.net/mHbXx/

Kent Fredric
quelle
Er hat die Frage geändert, aber Sie können es trotzdem besser machen, /:/auch nach der Bearbeitung :-)
Joey
Danke Mike =). Ich möchte mich nicht ernsthafter behaupten, die anderen Vorschläge sind nützlicher. Ich wollte nur auf das Problem mit der anfänglichen Prämisse hinweisen, damit sich die Qualität der Frage verbessern könnte =)
Kent Fredric
Bin es nur ich oder ist dies das passende "www .google .com"?
Schiavini
1
/https?\:\/\/\w+((\:\d+)?\/\S*)?/

Versuch das.

Ich beziehe die führenden und nachfolgenden Schrägstriche ein, die den regulären Ausdruck begrenzen. Hoffentlich schadet das nicht meiner Zeichenanzahl!

Dieses Muster beschränkt das Protokoll entweder auf http oder https, lässt eine optionale Portnummer zu und lässt dann alle Zeichen außer Leerzeichen zu.

RunnerRick
quelle