2010-05-04 21 views
93

¿Cómo puedo agregar http:// a una URL si aún no incluye un protocolo (por ejemplo, http://, https:// o ftp://)?Cómo agregar http: // si no existe en la URL?

Ejemplo:

addhttp("google.com"); // http://google.com 
addhttp("www.google.com"); // http://www.google.com 
addhttp("google.com"); // http://google.com 
addhttp("ftp://google.com"); // ftp://google.com 
addhttp("https://google.com"); // https://google.com 
addhttp("http://google.com"); // http://google.com 
addhttp("rubbish"); // http://rubbish 
+0

Si tuviera, ' mozilla.org' solo, ¿cómo saber si debería ser 'http',' https' o 'ftp'? –

+6

@Anthony: dice que quiere agregar "http: //" si no hay otro protocolo. – nickf

+3

@Anthony Pero cuando el usuario escribe la URL sin http: // o algo así, ¿espera que sea ftp: // o algo así? – Ryan

Respuesta

228

Una versión modificada de @nickf código:

function addhttp($url) { 
    if (!preg_match("~^(?:f|ht)tps?://~i", $url)) { 
     $url = "http://" . $url; 
    } 
    return $url; 
} 

Reconoce ftp://, ftps://, http:// y https:// de una manera insensible caso.

+0

Gracias Alix, la mejor versión y de trabajo es la tuya :) – Ryan

+1

@David: No hay problema, de nada. –

+4

Al comparar addhttp y addscheme a continuación, he llegado a la conclusión de que addscheme es mejor en términos de rendimiento: '$ url =" www.google.com "; $ init = microtime (verdadero); for ($ i = 1; $ i <100000; $ i ++) { \t addScheme ($ url); } echo microtime (true) - $ init; echo "
"; $ init = microtime (verdadero); para ($ i = 1; $ i <100000; $ i ++) { \t addhttp ($ url); } echo microtime (true) - $ init; ' –

-1

probar esto. No hermético *, pero podría ser lo suficientemente bueno:

function addhttp($url) { 
    if (!preg_match("@^[hf]tt?ps?://@", $url)) { 
     $url = "http://" . $url; 
    } 
    return $url; 
} 

*: es decir, prefijos como "fttps: //" son tratados como válida. solución

+5

Esto coincidiría (ergo return true y si se evaluaría como falso) combinaciones extrañas ..como htps, fttps, fttp, htp, supongo. – kamasheto

+0

Mi consejo para cualquiera que lea esto ... probablemente no use esto. –

0

nickf modificado:

function addhttp($url) { 
    if (!preg_match("@^https?://@i", $url) && !preg_match("@^ftps?://@i", $url)) { 
     $url = "http://" . $url; 
    } 
    return $url; 
} 
+0

Creo que 'ftps: //' también es válido. –

+0

@Alix: no estaba enterado de eso. Editado – kamasheto

2

Escanee la cadena para ://, si no la tiene, anteponga http:// a la cadena ..., todo lo demás simplemente use la cadena como está.

Esto funcionará a menos que tenga cadena de entrada de basura.

+0

prefiero una versión regex :) – Ryan

+3

No seas demasiado rápido en regex. Regex tiende a ser difícil de leer y podría presentar otro problema/error una vez que el problema crezca. –

48

Simplemente compruebe si hay un protocolo (delineado por ": //") y agregue "http: //" si no lo hay.

if (false === strpos($url, '://')) { 
    $url = 'http://' . $url; 
} 

Nota: Esto puede ser una solución simple y directo, pero la respuesta de Jack usando parse_url es casi tan simple y mucho más robusto. Probablemente deberías usar ese.

+5

+1 por ser la solución más legible de todas. La intención del programador se entiende rápidamente de un vistazo. –

+2

¿qué tal tales enlaces? Imán:? Fh = sdfs ... – holden321

+0

+1 para la solución más fácil –

0
<?php 

if (!preg_match("/^(http|ftp):/", $_POST['url'])) { 
    $_POST['url'] = 'http://'.$_POST['url']; 
} 
$url = $_POST['url']; 

?> 

este código agregará http: // a la URL si no está allí.

101

En el momento de la escritura, ninguna de las respuestas utilizó una función incorporada para esto:

function addScheme($url, $scheme = 'http://') 
{ 
    return parse_url($url, PHP_URL_SCHEME) === null ? 
    $scheme . $url : $url; 
} 

echo addScheme('google.com'); // "http://google.com" 
echo addScheme('https://google.com'); // "https://google.com" 

Ver también: parse_url()

+9

Esta debería ser la respuesta seleccionada: ¿por qué enrollar la suya cuando el idioma tiene soporte nativo? Buen trabajo. –

+1

Una mejora que se puede realizar con esta función es verificar si el campo tiene un valor, por lo que no agrega un http a un campo vacío. –

+0

Esto no funciona con protocolos relativos. p.ej. 'echo addScheme ('// google.com');' – Taylan

-4

utilice el prep_url ($ url);

$url = prep_url($url); 

si la verificación si es http existir nada sucede lo contrario, añadir el http: //

+1

Esa es una función codeigniter helper. ¿Qué pasa si no estás usando ese marco? –

1

la mejor respuesta para esto sería algo como esto:

function addhttp($url) 
{ 
    return $url = empty(parse_url($url)['scheme']) ? 'http://' . ltrim($url, '/') : $url; 
} 
Cuestiones relacionadas