¿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

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.


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()


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.


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;
}

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.


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;
}

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í.


-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.


6
Esto coincidiría (ergo devuelve verdadero y si se evaluaría como falso) combinaciones extrañas ... como htps, fttps, fttp, htp, supongo.
— kamasheto
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.