Ursprüngliche Antwort
Eine sehr schnelle und sehr flexible Prüfung ist:
if (url.indexOf('://') > 0 || url.indexOf('//') === 0 ) {
} else {
}
Dies erkennt eine absolute URL, wenn:
- Die URL enthält ": //" irgendwo nach dem ersten Zeichen oder
- URL beginnt mit "//" (protokollbezogen)
- Kein Regex.
- Keine jQuery oder andere Abhängigkeit.
- Keine fest codierten Protokollnamen, die die Bedingung zwischen Groß- und Kleinschreibung unterscheiden.
- Keine String-Manipulation (zB toLowerCase oder ähnliches).
- Für Web-URLs oder interne Protokolle können nur Überprüfungen auf "relativ oder absolut" verwendet werden, jedoch keine anderen Überprüfungen.
Update 1 (Vollfunktionsbeispiel)
Hier ist eine kurze Funktion , dass die Renditen true / false für die angegebene URL:
function isUrlAbsolute(url) {
return (url.indexOf('://') > 0 || url.indexOf('//') === 0);
}
Und dasselbe in ES6:
const isUrlAbsolute = (url) => (url.indexOf('://') > 0 || url.indexOf('//') === 0)
Update 2 (URLs innerhalb des URL-Parameters)
Um URLs zusätzlich im Format zu adressieren, /redirect?target=http://example.orgempfehle ich, diesen Code zu verwenden:
function isUrlAbsolute(url) {
if (url.indexOf('//') === 0) {return true;}
if (url.indexOf('://') === -1) {return false;}
if (url.indexOf('.') === -1) {return false;}
if (url.indexOf('/') === -1) {return false;}
if (url.indexOf(':') > url.indexOf('/')) {return false;}
if (url.indexOf('://') < url.indexOf('.')) {return true;}
return false;
}
Und das gleiche in Kurzform und ES 6
function isUrlAbsolute(url) {
return url.indexOf('//') === 0 ? true : url.indexOf('://') === -1 ? false : url.indexOf('.') === -1 ? false : url.indexOf('/') === -1 ? false : url.indexOf(':') > url.indexOf('/') ? false : url.indexOf('://') < url.indexOf('.') ? true : false;
}
const isUrlAbsolute = (url) => (url.indexOf('//') === 0 ? true : url.indexOf('://') === -1 ? false : url.indexOf('.') === -1 ? false : url.indexOf('/') === -1 ? false : url.indexOf(':') > url.indexOf('/') ? false : url.indexOf('://') < url.indexOf('.') ? true : false)
Hier einige Testfälle:
console.log( isUrlAbsolute('http://stackoverflow.com') )
console.log( isUrlAbsolute('//stackoverflow.com') )
console.log( isUrlAbsolute('stackoverflow.com') )
console.log( isUrlAbsolute('Ftp://example.net') )
console.log( isUrlAbsolute('/redirect?target=http://example.org') )
Update 3 (relative URLs klären)
Ich habe einige Kommentare zu ungültiger Ausgabe gesehen:
- Die Lösung gibt false für zurück
localhost
- Antwort schlägt fehl
http:example.com
Diese URLs sind jedoch tatsächlich relative URLs . Es ist einfach zu testen:
- Erstellen Sie beispielsweise einige Ordner auf Ihrer localhost-Webroot
a/b/c/
- Erstellen Sie eine index.html-Datei und fügen Sie den folgenden Link ein:
<a href="localhost">test</a>
- Öffnen Sie die Indexseite in Ihrem Browser: http: //localhost/a/b/c/index.html und klicken Sie auf den Link. Sie enden auf http: // localhost / a / b / c / localhost (und nicht auf http: // localhost ).
- Gleiches passiert, wenn Sie den Link
http:example.comin Ihre index.html-Datei einfügen. Sie enden auf http: //localhost/a/b/c/example.com anstelle von http://example.com
//.