Ich möchte eine URL validieren und eine Nachricht anzeigen. Unten ist mein Code:
$("#pageUrl").keydown(function(){
$(".status").show();
var url = $("#pageUrl").val();
if(isValidURL(url)){
$.ajax({
type: "POST",
url: "demo.php",
data: "pageUrl="+ url,
success: function(msg){
if(msg == 1 ){
$(".status").html('<img src="images/success.gif"/><span><strong>SiteID:</strong>12345678901234456</span>');
}else{
$(".status").html('<img src="images/failure.gif"/>');
}
}
});
}else{
$(".status").html('<img src="images/failure.gif"/>');
}
});
function isValidURL(url){
var RegExp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
if(RegExp.test(url)){
return true;
}else{
return false;
}
}
Mein Problem ist jetzt, dass eine Fehlermeldung angezeigt wird, selbst wenn eine richtige URL eingegeben wird, bis sie mit dem regulären Ausdruck übereinstimmt, und true zurückgegeben wird, selbst wenn die URL so etwas wie ist "http://wwww"
.
Ich freue mich über Ihre Vorschläge.
javascript
jquery
validation
url
vinay
quelle
quelle
RegExp
in Ihrem Beispiel) nicht groß zu schreiben, es sei denn, es handelt sich um Konstruktoren / Namespaces (was Ihre Variable nicht ist). Vergessen Sie auch nicht, dassRegExp#test
bereits Boolesche Werte zurückgegeben werden, sodass Sie das wirklich nicht benötigen, wenn / else; mach einfach -return re.test(url)
.goog.string.linkify
Namespace , die Sie von der Quelle hier herausreißen können: code.google.com/p/closure-library/source/browse/closure/goog/... Blick auffindFirstUrl()
.Antworten:
Jemand hat das Jquery Validation-Plugin erwähnt. Es scheint übertrieben, wenn Sie nur die URL validieren möchten. Hier ist die Regex-Zeile des Plugins:
Hier ist, woher sie es haben: http://projects.scottsplayground.com/iri/
Hervorgehoben von @nhahtdh Dies wurde aktualisiert auf:
Quelle: https://github.com/jzaefferer/jquery-validation/blob/c1db10a34c0847c28a5bd30e3ee1117e137ca834/src/core.js#L1349
quelle
filter_var($url, FILTER_VALIDATE_URL)
scheinen zum Beispiel KEINE Unterstriche in Domainnamen zuzulassen.www.google.com
ist keine gültige URL, daher sollte der Test fehlschlagen.Es ist nicht praktisch, URLs mit Regex zu analysieren. Eine vollständige Implementierung der RFC1738-Regeln würde zu einem enorm langen regulären Ausdruck führen (vorausgesetzt, dies ist überhaupt möglich). Sicherlich schlägt Ihr aktueller Ausdruck viele gültige URLs fehl und übergibt ungültige.
Stattdessen:
ein. Verwenden Sie einen geeigneten URL-Parser, der den tatsächlichen Regeln entspricht. (Ich kenne keine für JavaScript; es wäre wahrscheinlich übertrieben. Sie könnten es jedoch auf der Serverseite tun). Oder,
b. Entfernen Sie einfach alle führenden oder nachfolgenden Leerzeichen, und überprüfen Sie, ob sich auf der Vorderseite eines Ihrer bevorzugten Schemata befindet (normalerweise "http: //" oder "https: //"). Lassen Sie es dabei. Oder,
c. Versuchen Sie, die URL zu verwenden und zu sehen, was am Ende liegt, indem Sie beispielsweise eine HTTP-HEAD-Anfrage von der Serverseite senden. Wenn Sie einen 404- oder Verbindungsfehler erhalten, ist dieser wahrscheinlich falsch.
Nun, das ist in der Tat eine vollkommen gültige URL.
Wenn Sie überprüfen möchten, ob ein Hostname wie "wwww" tatsächlich vorhanden ist, haben Sie keine andere Wahl, als ihn im DNS nachzuschlagen. Auch dies wäre serverseitiger Code.
quelle
Dies kann für URLs wie: true zurückgeben.
oder:
quelle
RegExp
Konstruktor? Ein Literal ist hier in Ordnung. Warum das Objekt einer Variablen zuweisen?function validateURL(textval) { return /^(http...$/.test(textval) }
ist etwas kürzer und klarer.<a href="">
.Ich habe auch eine URL-Validierungsfunktion geschrieben, die auf rfc1738 und rfc3986 basiert, um http- und https-URLs zu überprüfen. Ich versuche, dieses Modul zu halten, damit es besser gewartet und an die eigenen Anforderungen angepasst werden kann.
Das RegExp in einer Zeile wird am Ende dieses Beitrags angezeigt.
Die RegExp akzeptieren HTTP- und HTTPS-URLs mit einer internationalen Domain oder IPv4-Nummer. IPv6 wird noch nicht unterstützt.
RegExp in einer Zeile:
quelle
In einer ähnlichen Situation bin ich damit durchgekommen:
dh warum das Rad erfinden, wenn Browser es für Sie tun können? Dies funktioniert aber natürlich nur im Browser.
Es gibt verschiedene Teile der analysierten URL, wie der Browser sie genau interpretieren würde:
Mit diesen können Sie Ihre Validierungsfunktion je nach Anforderung verbessern. Der einzige Nachteil besteht darin, dass relative URLs akzeptiert werden und der Host und der Port des aktuellen Seitenservers verwendet werden. Sie können es jedoch zu Ihrem Vorteil nutzen, indem Sie die URL aus Teilen neu zusammenstellen und sie immer vollständig an Ihren AJAX-Dienst weitergeben.
Was
validateURL
nicht akzeptiert wird, ist eine ungültige URL, z. B.http:\:8883
wird false zurückgegeben,:1234
ist jedoch gültig und wird alshttp://pagehost.example.com/:1234
dh als relativer Pfad interpretiert .AKTUALISIEREN
Dieser Ansatz funktioniert nicht mehr mit Chrome und anderen WebKit-Browsern. Selbst wenn die URL ungültig ist, wird der Hostname mit einem Wert gefüllt, z
base
. B. aus . Es hilft immer noch, Teile der URL zu analysieren, erlaubt jedoch nicht, eine zu validieren.Ein möglicher besserer No-Own-Parser-Ansatz besteht darin
var parsedURL = new URL(url)
, Ausnahmen zu verwenden und abzufangen. Siehe zB URL API . Unterstützt von allen gängigen Browsern und NodeJS, obwohl immer noch als experimentell markiert.quelle
<script>alert();</script>
bester Regex, den ich von http://angularjs.org/ gefunden habe
var urlregex = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
quelle
Das hat bei mir funktioniert:
Von dort aus muss nur noch die Funktion aufgerufen werden, um ein wahres oder falsches Ergebnis zu erhalten:
quelle
Ich weiß, dass es eine ziemlich alte Frage ist, aber da sie keine akzeptierte Antwort hat, empfehle ich Ihnen, das URI.js-Framework zu verwenden: https://github.com/medialize/URI.js
Sie können es verwenden, um mithilfe eines Try / Catch-Blocks nach fehlerhaften URIs zu suchen:
Natürlich wird so etwas wie "% @" als wohlgeformter relativer URI betrachtet ... Ich schlage daher vor, dass Sie die URI.js- API lesen , um weitere Überprüfungen durchzuführen, beispielsweise wenn Sie sicherstellen möchten, dass der Benutzer einen wohlgeformten URI eingegeben hat absolute URL, die Ihnen folgendermaßen gefallen könnte:
quelle
!!uri.scheme().match(/^http(s?)$/)
zum Test hinzuzufügen .Import in ein npm-Paket wie
https://www.npmjs.com/package/valid-url
und verwenden Sie es, um Ihre URL zu validieren.
quelle
Sie können die URL-API verwenden , die seit kurzem Standard ist. Die Browserunterstützung ist bestenfalls lückenhaft, siehe Link.
new URL(str)
ist garantiert zu werfenTypeError
für ungültige URLs .Wie oben angegeben,
http://wwww
ist eine gültige URL.quelle
Wenn Sie nach einem zuverlässigeren Regex suchen, schauen Sie sich RegexLib an. Hier ist die Seite, die Sie wahrscheinlich interessieren würde:
http://regexlib.com/Search.aspx?k=url
Wenn die Fehlermeldungen angezeigt werden, während die Person noch tippt, ändern Sie das Ereignis von
keydown
inblur
und es wird erst überprüft, wenn die Person zum nächsten Element wechselt.quelle
quelle
Meine Lösung:
quelle
Demo: http://jsbin.com/uzimeb/1/edit
quelle
Ich habe eine großartige Ressource zum Vergleichen verschiedener Lösungen gefunden: https://mathiasbynens.be/demo/url-regex
Laut dieser Seite besteht nur die Lösung von diegoperini alle Tests. Hier ist diese Regex:
quelle
Ich habe viele URL-Validatoren in Google überprüft und niemand arbeitet für mich. Zum Beispiel möchte ich sehen, dass Links wie 'aa.com' gültig sind. Ich mag dumme Prüfung für Punktzeichen in Zeichenfolge.
Es sollte nicht am Anfang und Ende der Zeichenfolge bleiben (im Moment haben wir keine Domain-Namen der obersten Ebene mit einem Zeichen).
quelle
Hier ist ein regulärer Ausdruck, der in die Rechnung passt (er ist sehr lang):
Die Verwendung weist einige Einschränkungen auf, nämlich, dass URIs, die zusätzliche Informationen nach dem Benutzernamen enthalten (z. B. "Benutzername: Kennwort"), nicht überprüft werden. Außerdem können nur IPv6-Adressen in der IP-Literal-Syntax enthalten sein, und die "IPvFuture" -Syntax wird derzeit ignoriert und wird nicht anhand dieses regulären Ausdrucks überprüft. Die Portnummern müssen ebenfalls zwischen 0 und 65.535 liegen. Außerdem kann nur das Dateischema dreifache Schrägstriche verwenden (z. B. "file: /// etc / sysconfig") und sowohl die Abfrage- als auch die Fragmentteile eines URI ignorieren. Schließlich ist es auf reguläre URIs und nicht auf IRIs ausgerichtet, daher der umfassende Fokus auf den ASCII-Zeichensatz.
Dieser reguläre Ausdruck könnte erweitert werden, ist aber bereits komplex und lang genug. Ich kann auch nicht garantieren, dass es "100% genau" oder "fehlerfrei" sein wird, aber es sollte URIs für alle Schemata korrekt validieren.
Sie müssen zusätzliche Überprüfungen für alle schemaspezifischen Anforderungen durchführen oder eine URI-Normalisierung durchführen, da dieser reguläre Ausdruck eine sehr breite Palette von URIs validiert.
quelle
Versuchen Sie, Ihre
isValidURL
Funktion wie folgt zu bearbeiten :Dies sollte den Trick tun.
quelle