2010-08-22 4 views
26

J'ai un champ input qui enregistre une URL, je voudrais que cette entrée enregistrée reconnaisse quand "Http //" est absent du début de la variable mais n'a aucune idée par où commencer ... est-il possible de vérifier seulement une partie d'une chaîne? - alors avoir une fonction qui ajoutera si nécessaire?Ajout de "http: //" à une URL qui ne contient pas déjà "http: //"

+3

https également une considération? –

Répondre

55

Une solution simple pour ce que vous voulez est la suivante:

var prefix = 'http://'; 
if (s.substr(0, prefix.length) !== prefix) 
{ 
    s = prefix + s; 
} 

Cependant, il y a quelques choses que vous devriez être au courant ...

Le test ici est sensible à la casse . Cela signifie que si la chaîne est initialement Http://example.com cela la changera en http://Http://example.com ce qui n'est probablement pas ce que vous voulez. Vous ne devriez probablement pas modifier n'importe quelle chaîne commençant par foo:// sinon vous pourriez vous retrouver avec quelque chose comme http://https://example.com.

D'autre part, si vous recevez une entrée telle que example.com?redirect=http://othersite.com alors vous ne voulez probablement préfixer http:// si juste la recherche de :// pourrait ne pas être assez bon pour une solution générale.

Approches alternatives

  • En utilisant une expression régulière:

    if (!s.match(/^[a-zA-Z]+:\/\//)) 
    { 
        s = 'http://' + s; 
    } 
    
  • En utilisant une bibliothèque URI telle que l'analyse syntaxique JS-URI.

    if (new URI(s).scheme === null) 
    { 
        s = 'http://' + s; 
    } 
    

Questions connexes

+1

Ceci est recommandé. – Marwelln

+0

Bonne solution. Continuez –

+1

Note pour les URLs relatives au protocole (URL commençant par) '//', cela peut avoir des résultats inattendus. ex: '// example.com/foo', le code ci-dessus le remplacerait par' http: //// example.com/foo' –

2

Quelque chose comme ça (écrire par la mémoire)?

if (url.toUpper(url.substring(0, 7) != "HTTP://") 
    url = "http://" + url; 
+5

'url.substring (0, 7) .toUpperCase()' –

-1

Vous pouvez utilisez "StartsWith" un membre de System.String.

if (url.ToUpper().StartsWith("HTTP://")) 
{ 

} 
+0

Ce n'est pas C#. – quantumSoup

+4

if (estNotC#) {return "StartWith n'existe pas."; } – Hello71

+0

La beauté de Javascript est que cela peut être fait. –

12

Lifted du Linkenizer (nul ne l'esprit)

link = (link.indexOf('://') === -1) ? 'http://' + link : link; 

Cela préfixer 'http://'-link si elle ne trouve pas le protocole :// indiquant. Cela ne fonctionnera pas bien si :// se produit ailleurs dans la chaîne, mais c'est assez bon.

Exemples:

http://www.google.com -> http://www.google.com 
ftp://google.com  -> ftp://google.com 
www.google.com  -> http://www.google.com 
google.com   -> http://google.com 

Puisque vous avez dit que vous enregistrez cette URL, ce serait une meilleure idée de le faire sur le côté serveur, afin que les clients qui ont js désactivé ne sera pas gâcher les liens.

+0

Gardez à l'esprit que cette va échouer pour les liens 'mailto:'. –

76

Si vous voulez aussi « https: // », je voudrais utiliser une expression régulière comme ceci:

if (!/^https?:\/\//i.test(url)) { 
    url = 'http://' + url; 
} 

Si vous n'êtes pas familier avec les expressions régulières, voici ce que chaque partie signifie.

  • ^ - Seulement match au début de la chaîne
  • http - Faites correspondre la chaîne "http"
  • s? - match En option, un "s"
  • : - Faites correspondre les deux points
  • \/\/ - Échappe les caractères "/" car ils marquent le début/la fin de l'expression régulière
  • Le "i" après l'expression régulière le fait insensible à la casse il correspondra à "http: //", etc.
+0

n'aide pas si l'URL a 'Http:' ou 'HTTP:' déjà. –

+0

Vous devez savoir que '' '!/^ Https?: \/\ // i.test (undefined)' '' est '' '' '' '' '' 'true'''. Je suggère de vérifier si '' '' url''' n'est pas falsey: '' 'si (!! url &&!/^ Https?: \/\ // i.test (url)) {...' '' –

+2

Utilisez '' '!/^ (Https?:)? \/\ // i.test (url)' '' pour gérer aussi //:example.com. –

2
if (url.indexOf('http://') != 0) 
    url = 'http://' + url; 
0

j'utilise ce qui est partiellement prise de php docs

$scheme = parse_url($link, PHP_URL_SCHEME); 
if (empty($scheme)) { 
    $link = 'http://' . ltrim($link, '/'); 
} 
4

Voici ce que j'utilise pour gratification instantanée. en utilisant l'écouteur keyup dans jquery.

$('#url').keyup(function() { 
     if ( ($(this).val().length >=5) && ($(this).val().substr(0, 5) != 'http:') && ($(this).val().substr(0, 5) != 'https')) { 
      $(this).val('http://' + $(this).val()); 
     } 
    }); 
+1

merci, utilisé ceci, juste changé le sélecteur JQuery à '' '$ ('input [type = url]')' '' – dirk

3

Je modifié la réponse de Byers @ Mark d'inclure "https: //" aussi bien.

function formatUrl(url){ 
    var httpString = 'http://' 
     , httpsString = 'https://' 
     ; 

    if (url.substr(0, httpString.length) !== httpString && url.substr(0, httpsString.length) !== httpsString) 
     url = httpString + url; 

    return url; 
} 
0

J'ai modifié les réponses @Morgan Taylor et @Mark Byer pour qu'elles ne soient pas sensibles à la casse. Fonctionne avec http: // et https: //

function formatUrl(url) 
{ 
    var httpString = "http://"; 
    var httpsString = "https://"; 
    if (url.substr(0, httpString.length).toLowerCase() !== httpString && url.substr(0, httpsString.length).toLowerCase() !== httpsString) 
       url = httpString + url; 
    return url; 
} 
1

Ci-dessous vérifie extrait de code pour:

  • vérifie si url n'est pas vide
  • Supprime espaces parasites au début ou à la fin
  • chèques pour http://example.com, https://example.com ET //example.com

    if (!!url && !!url.trim()) { //Check if url is not blank 
        url = url.trim(); //Removes blank spaces from start and end 
        if (!/^(https?:)?\/\//i.test(url)) { //Checks for if url doesn't match either of: http://example.com, https://example.com AND //example.com 
         url = 'http://' + url; //Prepend http:// to the URL 
        } 
    } else { 
        //Handle empty url 
    } 
    
Questions connexes