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

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.


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


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


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

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


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

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.


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


6
Cela correspondrait (ergo retourne vrai et si serait évalué à faux) des combinaisons étranges .. comme htps, fttps, fttp, htp, je suppose.
kamasheto
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.