Comment tester si une chaîne d'URL est absolue ou relative?
Comment puis-je tester une URL si c'est un chemin relatif ou absolu en Javascript ou jQuery? Je veux agir en conséquence en fonction de si l'adopté dans l'URL est un local ou externe chemin.
if (urlString starts with http://or https://)
//do this
- 'somestring'.indexOf() ou en utilisant les regex ;]
Vous devez vous connecter pour publier un commentaire.
Pour le protocole relatif url, utilisez cette regex:
/^https?:\/\/|^\/\//i
*
au lieu de?
?//
.RAPIDE
Si vous avez uniquement besoin de tester pour
http://
ouhttps://
puis le plus efficace façon est:UNIVERSELLE
Cependant, je vous suggère un plus universel, non sensible à la casse, indépendant du protocole approche:
Expliquer la RegExp
^
- début de la chaîne(?:
- début d'un non-groupe capturé[a-z]+
- tous les caractères de 'a' à 'z' 1 ou plusieurs fois:
- chaîne (virgule))?
- fin de non-groupe capturé. Groupe apparaître 0 ou 1 fois//
- chaîne (deux caractères barre oblique)'i'
- non sensible à la casse drapeau/^(?:[a-z]+:)?\/\//i.test('https://www.ex-maple-123.com');
var r = new RegExp('^\\s*(?:[a-z0-9]+:)?//', 'i')
//
=\/\/
mailto:...
,about:...
&sms:...
va provoquer des faux positifs lors de la tentative de trouver relative chemins (aussi, des choses qui ne sont pas valides Lieux).mailto:
, etc. ne sont pas des Url, mais plutôt d'Uri et devraient donc être traitées différemment, si pas entièrement bloqué.view-source:
ne correspond pas.Utiliser une regex:
mailto:
peut être absolu ou relatif, parfois?mailto:
est absolue, même si elle n'a pas de/
caractères.Un très rapide et très flexible vérifier est:
Cela reconnaître une URL absolue, si:
Mise à jour
Voici une petite fonction qui renvoie la valeur true/false pour l'URL:
Et même dans l'ES6:
Mise à jour 2
De l'adresse Url au format
/redirect?target=http://example.org
je recommande d'utiliser ce code:Et même dans sa forme courte et ES 6
Ici sont quelques-uns des cas de test:
/redirect?target=http://example.org
function isUrlAbsolute(url) { var firstSlash = url.indexOf('/'); var colonDoubleSlash = url.indexOf('://'); return ((firstSlash > 0 && colonDoubleSlash > 0 && colonDoubleSlash < firstSlash) || url.indexOf('//') === 0); }
/redirect?target=http%3A%2F%2Fexample.com
<img src="/aaa/bbb">
sur site1.com et site2.com les deux images sont différentes (c'est à dire relative). Alors que<img src="//site1.com/aaa/bbb">
est identique pour tous les domaines (ce qui est absolu)Aujourd'hui, où beaucoup de l'utilisation des services de protocole relatif URL (eg. //cdn.example.com/libary.js), cette méthode est plus sûre:
'^([A-Za-z]+://|//)'
i
drapeau pour ignorer la casse. Réponse d'édition. Merci.Encore plus Universel conforme à la RFC URI approche:
(?:^[a-z][a-z0-9+.-]*:|\/\/)
regex explicationLes autres solutions proposées ici serait un échec pour les liens comme
mailto:[email protected]
RFC 3986 définit un Régime comme:
scheme = ALPHA *( ALPHA /DIGIT /"+" /"-" /"." )
3.1. Schéma
https://tools.ietf.org/html/rfc3986#section-3.1
Tandis que le protocole relatif url est techniquement valides conformément à la section 4.2, Paul Irlandais a basculé de l'autre côté, et considère cela comme un anti-modèle. Voir http://www.paulirish.com/2010/the-protocol-relative-url/
4.2. Référence Relative
http://tools.ietf.org/html/rfc3986#section-4.2
Si vous souhaitez que les regex sans protocole url relative à l'utilisation:
^[a-z][a-z0-9+.-]*:
Pour voir une liste complète des autres types d'uri valide bord des cas, consultez la liste ici: https://en.wikipedia.org/wiki/URI_scheme
^
aller à l'extérieur du groupe? Comme l'a écrit il correspond//
dans le pas-position de départ (donc une URL relative, comme#//
correspondent). Aussi, il est important de spécifier que cette expression devrait être sensible à la casse, de sorte que la définition complète ressemblerait/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i
.*
avec+
.EDIT:
Avec la prochaine expression régulière, vous pouvez même vérifier si le lien va vers le même domaine ou à une externe:
.
personnages qui vont presque certainement être le nom d'hôte. Autrement foo.example.com correspond aussi à la fooXexample.comNe pas utiliser de bas niveau, des trucs comme regexp etc. Ces choses ont été résolus par beaucoup d'autres personnes. En particulier les cas de bord.
Ont un coup d'oeil à URI.js, il devrait faire la job: http://medialize.github.io/URI.js/docs.html#is
Fonction suivante sera appelée lors d'un clic se produit même sur un lien hypertexte j'.e 'un' tag si l'étiquette contient l'url sera relatif ou contient même hôte alors que la nouvelle page va se charger en même onglet du navigateur si elle contient des url différentes, puis le chargement de la page dans le nouvel onglet de navigateur
Voici un pare-balles approche du problème:
Laisser le navigateur charge de tout pour nous. Aucun besoin de certains compliqué/les risques d'erreurs regexes.
Malheureusement ne fonctionne pas dans un nodejs environnement.