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

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.


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


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.


2

A melhor resposta para isso seria algo assim:

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

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.


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

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


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


6
Isso corresponderia (portanto, retornaria verdadeiro e se avaliaria como falso) combinações estranhas .. como htps, fttps, fttp, htp, eu acho.
Kamasheto
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.