2010-08-22 55 views
26

Tengo un campo input que guarda una URL, me gustaría que esta entrada guardada se reconozca cuando "Http //" está ausente desde el comienzo de la variable, pero no tiene idea de por dónde empezar ... ¿es posible verificar solo una parte de una cadena? - Entonces, ¿tiene una función que se agregará si es necesario?Anteponiendo "http: //" a una URL que ya no contiene "http: //"

+3

también una consideración? –

Respuesta

55

Una solución simple para lo que quiere es la siguiente:

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

Sin embargo, hay algunas cosas que usted debe tener en cuenta ...

La prueba aquí es entre mayúsculas y minúsculas . Esto significa que si la cadena es inicialmente Http://example.com, esto lo cambiará a http://Http://example.com, que probablemente no sea lo que usted quiere. Probablemente tampoco deba modificar ninguna cadena que comience por foo://; de lo contrario, podría terminar con algo como http://https://example.com.

Por otro lado si recibe una entrada como example.com?redirect=http://othersite.com entonces es probable que quieren anteponer http:// por lo que sólo la búsqueda de :// podría no ser lo suficientemente bueno para una solución general.

Enfoques alternativos

  • Usando una expresión regular:

    if (!s.match(/^[a-zA-Z]+:\/\//)) 
    { 
        s = 'http://' + s; 
    } 
    
  • usando una biblioteca de análisis sintáctico URI como JS-URI.

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

preguntas relacionadas

+1

Esto es recomendado. – Marwelln

+0

Buena solución. Seguir así –

+1

Nota para el protocolo relativo URLS (URL que comienzan con) '//', esto puede tener resultados inesperados. ex: '// example.com/foo', el código anterior lo cambiaría a' http: //// example.com/foo' –

2

Algo como esto (escritura de memoria)?

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

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

-1

Puede utilice "StartsWith" un miembro de System.String.

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

} 
+0

Esto no es C#. – quantumSoup

+4

if (isNotC#) {return "StartWith does not exists."; } – Hello71

+0

La belleza de Javascript es que esto se puede hacer. –

12

levanta de la Linkenizer (Null no importa)

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

Este antepondrá 'http://'-link si no puede encontrar la :// indicación de protocolo. Esto no funcionará bien si :// aparece en otra parte de la cadena, pero es lo suficientemente bueno.

Ejemplos:

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 

ya que dijo que está guardando este URL, sería una mejor idea de hacer esto en el lado del servidor, por lo que los clientes que tienen JS desactivado no se hace un lío hasta los enlaces.

+0

Tenga en cuenta que esto fallará para los enlaces 'mailto:'. –

76

Si también desea permitir "https: //", me gustaría utilizar una expresión regular como esto:

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

Si usted no está familiarizado con las expresiones regulares, esto es lo que significa cada parte.

  • ^ - Sólo partido en el principio de la cadena
  • http - Unir la cadena literal "http"
  • s? - coincidir Opcionalmente una "s"
  • : - Unir dos puntos
  • \/\/ - Escapar los caracteres "/" ya que marcan el comienzo/final de la expresión regular
  • La "i" después de la expresión regular lo hace entre mayúsculas y minúsculas por lo que coincidirá con "http: //", etc.
+0

no ayuda si la url ya tiene 'Http:' o 'HTTP:'. –

+0

Debe tener en cuenta que '' '!/^ Https?: \/\ // i.test (undefined)' '' es '' 'true'''. Sugiero verificar si '' 'url''' no es falsey: ' '' if (!! url &&!/^ Https?: \/\ // i.test (url)) {... ' '' –

+2

Use '' '!/^ (Https?:)? \/\ // i.test (url)' '' para manejar //:example.com también. –

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

Yo personalmente uso este, que se toma parcialmente de documentos php

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

Esto es lo que yo uso para gratificación instantánea. utilizando el oyente keyup en 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

gracias, usado esto, acaba de cambiar el selector JQuery a '' '$ ('input [type = url]')' '' – dirk

3

Alteré la respuesta @Mark Byers para incluir "https: //" también.

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

He alterado las respuestas de @Morgan Taylor's y @Mark Byer para ser insensible a mayúsculas y minúsculas. Funciona con http: // y 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

A continuación cheques del fragmento de código para:

  • Comprueba si el URL no está en blanco
  • Elimina espacios en blanco callejeros al principio o al final
  • cheques para http://example.com, https://example.com Y //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 
    } 
    
https
Cuestiones relacionadas