Comment ajouter http: // s'il n'existe pas dans l'URL?

110

Comment puis-je ajouter http://à une URL si elle n'inclut pas déjà un protocole (par exemple http://, https://ou ftp://)?

Exemple:

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
la source
Si vous aviez, mozilla.orgseul, comment sauriez-vous si cela devrait être http, httpsou ftp?
Anthony Forloney
7
@Anthony: il dit qu'il veut ajouter "http: //" s'il n'y a pas d'autre protocole.
nickf
3
@Anthony Mais lorsque l'utilisateur tape l'url sans http: // ou quoi que ce soit, vous attendez-vous à ce que ce soit ftp: // ou quelque chose?
Ryan

Réponses:

265

Une version modifiée du code @nickf:

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

Constate ftp://, ftps://, http://et https://dans un cas de manière insensible.

Alix Axel
la source
5
Après avoir comparé addhttp et addcheme ci-dessous, je suis arrivé à la conclusion que l'ajout de schéma est meilleur en termes de performances: $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
Et si l'URL commence par «//»?
holden321
@ holden321 Cela me rappelle le poème sur l'éléphant qui est allé nager et est revenu comme un poisson avec la mentalité de vous empêcher à tout prix de faire et des choses qui pourraient vous blesser. Il y a tellement de gens dans le monde, et vous savez, vous avez ces idées incroyables et ce qui vous manque, c'est la motivation, mais ce n'est pas vrai. parce que la façon dont nos esprits sont câblés et les faits sur les êtres humains est que nous ne sommes pas conçus pour faire des choses qui ne sont pas confortables.
coup de circuit
136

Au moment de la rédaction de cet article, aucune des réponses n'utilisait de fonction intégrée pour cela:

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"

Voir également: parse_url()

Jack
la source
13
Cela devrait être la réponse choisie - pourquoi rouler le vôtre alors que la langue a un support natif? Bon travail.
Tom Auger
2
Une amélioration qui pourrait être apportée avec cette fonction est de vérifier si le champ a une valeur afin qu'il n'ajoute pas un http à un champ vide.
Randy Johnson
Cela ne fonctionne pas avec les protocoles relatifs. par exempleecho addScheme('//google.com');
Taylan
2
@Taylan Ouais, tu devraisltrim($url, '/')
Ja͢ck
51

Vérifiez simplement s'il existe un protocole (délimité par ": //") et ajoutez "http: //" s'il n'y en a pas.

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

Remarque : cela peut être une solution simple et directe, mais la réponse de Jack en utilisant parse_urlest presque aussi simple et beaucoup plus robuste. Vous devriez probablement utiliser celui-là.

Brenton Alker
la source
2

La meilleure réponse pour cela serait quelque chose comme ceci:

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

Scannez la chaîne pour ://, si elle ne l'a pas, ajoutez-la http://à la chaîne .., tout le reste utilise simplement la chaîne telle quelle .

Cela fonctionnera à moins que vous n'ayez une chaîne d'entrée de mauvaise qualité.

Rosdi Kasim
la source
je préfère une version regex :)
Ryan
3
Ne soyez pas trop rapide sur les regex. Regex a tendance à être difficile à lire et cela pourrait introduire un autre problème / bogue une fois que le problème s'agrandit.
Rosdi Kasim
0

nickf solution modifiée:

function addhttp($url) {
    if (!preg_match("@^https?://@i", $url) && !preg_match("@^ftps?://@i", $url)) {
        $url = "http://" . $url;
    }
    return $url;
}
Kamasheto
la source
Je crois que ftps://c'est également valable.
Alix Axel
@Alix: n'en était pas conscient. Édité.
kamasheto
0
<?php

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

?>

ce code ajoutera http: // à l'URL s'il n'y est pas.

ayan
la source
-1

Essaye ça. Pas étanche *, mais peut-être assez bon:

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

*: autrement dit, les préfixes comme "fttps: //" sont traités comme valides.

nickf
la source
6
Cela correspondrait (ergo retourne vrai et si serait évalué à faux) des combinaisons étranges .. comme htps, fttps, fttp, htp, je suppose.
kamasheto