Como adicionar http: // se não existir na URL?

110

Como posso adicionar http://a um URL se ele ainda não inclui um protocolo (por exemplo http://, https://ou ftp://)?

Exemplo:

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
fonte
Se você tivesse, mozilla.orgsozinho, como saberia se deveria ser http, httpsou ftp?
Anthony Forloney
7
@Anthony: ele diz que deseja adicionar "http: //" se não houver outro protocolo.
nickf
3
@Anthony Mas quando o usuário digita a url sem http: // ou nada, você espera que seja ftp: // ou algo assim?
Ryan

Respostas:

265

Uma versão modificada do código @nickf:

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

Reconhece ftp://, ftps://, http://e https://de uma forma maiúsculas e minúsculas.

Alix Axel
fonte
5
Depois de comparar addhttp e addscheme abaixo, cheguei à conclusão de que addscheme é melhor em termos de desempenho: $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
E se o url começar com '//'?
holden321
@ holden321 Isso me lembra o poema sobre o Elefante que foi nadar e voltou como um peixe com a mentalidade de impedi-lo a todo custo de fazer e coisas que poderiam te machucar. Existem tantas pessoas no mundo, e você sabe, você tem essas ideias incríveis e o que você acha que está faltando é motivação, mas isso não é verdade. porque a maneira como nossas mentes estão conectadas e os fatos sobre os seres humanos é que não fomos projetados para fazer coisas que não são confortáveis.
homerun
136

No momento da escrita, nenhuma das respostas usava uma função integrada para isso:

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"

Veja também: parse_url()

Ja͢ck
fonte
13
Esta deve ser a resposta selecionada - por que lançar a sua própria quando o idioma tem suporte nativo? Bom trabalho.
Tom Auger
2
Uma melhoria que poderia ser feita com esta função é verificar se o campo tem um valor para não adicionar um http a um campo vazio.
Randy Johnson,
Isso não funciona com protocolos relativos. por exemploecho addScheme('//google.com');
Taylan
2
@Taylan Sim, você teria queltrim($url, '/')
Ja͢ck
51

Basta verificar se existe um protocolo (delineado por ": //") e adicionar "http: //" se não houver.

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

Nota : Esta pode ser uma solução simples e direta, mas a resposta de Jack usando parse_urlé quase tão simples e muito mais robusta. Você provavelmente deve usar esse.

Brenton Alker
fonte
2

A melhor resposta para isso seria algo assim:

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

Escaneie a string para ://, se não tiver, prefixehttp:// à string .., todo o resto use a string como está.

Isso funcionará a menos que você tenha uma string de entrada lixo.

Rosdi Kasim
fonte
prefiro uma versão regex :)
Ryan
3
Não seja muito rápido no regex. Regex tende a ser difícil de ler e pode introduzir outro problema / bug quando o problema aumentar.
Rosdi Kasim
0

solução de nickf modificada:

function addhttp($url) {
    if (!preg_match("@^https?://@i", $url) && !preg_match("@^ftps?://@i", $url)) {
        $url = "http://" . $url;
    }
    return $url;
}
Kamasheto
fonte
Eu acredito que ftps://também é válido.
Alix Axel
@Alix: não sabia disso. Editado.
Kamasheto
0
<?php

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

?>

este código adicionará http: // à URL se não estiver lá.

ayan
fonte
-1

Experimente isso. Não é estanque *, mas pode ser bom o suficiente:

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

*: isto é, prefixos como "fttps: //" são tratados como válidos.

nickf
fonte
6
Isso corresponderia (portanto, retornaria verdadeiro e se avaliaria como falso) combinações estranhas .. como htps, fttps, fttp, htp, eu acho.
Kamasheto