¿Cómo agregar http: // si no existe en la URL?

110

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

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
Ryan
fuente
Si lo hubiera hecho, mozilla.orgsolo, ¿cómo sabría si debería ser http, httpso ftp?
Anthony Forloney
7
@Anthony: dice que quiere agregar "http: //" si no hay otro protocolo.
nickf
3
@Anthony Pero cuando el usuario escribe la URL sin http: // ni nada, ¿esperas que sea ftp: // o algo así?
Ryan

Respuestas:

265

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

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 sensible a mayúsculas.

Alix Axel
fuente
5
Después de comparar addhttp y addcheme a continuación, he llegado a la conclusión de que addedcheme es mejor en términos de rendimiento: $url = "www.google.com"; $init = microtime(true); for( $i = 1; $i < 100000; $i++ ) { addScheme( $url ); } echo microtime(true) - $init; echo "<BR>"; $init = microtime(true); for( $i = 1; $i < 100000; $i++ ) { addhttp( $url ); } echo microtime(true) - $init;
Luis Lobo Borobia
¿Qué pasa si la URL comienza con '//'?
holden321
@ holden321 Me recuerda el poema sobre el elefante que se fue a nadar y regresó como un pez con la mentalidad de impedirte a toda costa hacer cosas que podrían lastimarte. Hay tanta gente en el mundo, y sabes, tienes ideas increíbles y lo que crees que falta es motivación, pero eso no es cierto. porque la forma en que nuestras mentes están conectadas y los hechos sobre los seres humanos es que no estamos diseñados para hacer cosas que no son cómodas.
homerun
136

En el momento de escribir este artículo, ninguna de las respuestas usaba 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()

Jack
fuente
13
Esta debería ser la respuesta seleccionada: ¿por qué lanzar la suya propia cuando el idioma tiene soporte nativo? Buen trabajo.
Tom Auger
2
Una mejora que se podría hacer con esta función es verificar si el campo tiene un valor para que no agregue un http a un campo vacío.
Randy Johnson
Esto no funciona con protocolos relativos. Ej .echo addScheme('//google.com');
Taylan
2
@Taylan Sí, tendrías que hacerloltrim($url, '/')
Ja͢ck
51

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

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

Nota : Esta puede ser una solución simple y directa, pero el uso de la respuesta de Jack parse_urles casi tan simple y mucho más robusto. Probablemente deberías usar ese.

Brenton Alker
fuente
2

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

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

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

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

Rosdi Kasim
fuente
prefiero una versión con expresiones regulares :)
Ryan
3
No seas demasiado rápido con las expresiones regulares. Regex tiende a ser difícil de leer y podría introducir otro problema / error una vez que el problema crece.
Rosdi Kasim
0

solución de nickf modificada:

function addhttp($url) {
    if (!preg_match("@^https?://@i", $url) && !preg_match("@^ftps?://@i", $url)) {
        $url = "http://" . $url;
    }
    return $url;
}
kamasheto
fuente
Yo creo ftps://que también es válido.
Alix Axel
@Alix: no estaba al tanto de eso. Editado.
kamasheto
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í.

ayan
fuente
-1

Prueba 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, los prefijos como "fttps: //" se tratan como válidos.

nickf
fuente
6
Esto coincidiría (ergo devuelve verdadero y si se evaluaría como falso) combinaciones extrañas ... como htps, fttps, fttp, htp, supongo.
kamasheto