web-dev-qa-db-fra.com

Ajouter le préfixe http: // à l'URL lorsqu'il manque

Bonjour j'ai un code tres simple

<a href="'.$aProfileInfo['Website'].'" target="_self">
    <div class="callButton">Website</div>
</a>

Le problème est que si l'utilisateur n'entre pas http: // le lien pointera alors vers mon site Web et non vers le site Web externe comme il se doit.

Comment puis-je vérifier dans PHP si l'utilisateur n'a pas entré http: // et l'ajouter automatiquement lorsqu'il n'y est pas?

22
DiegoP.

Une solution simple qui peut ne pas fonctionner dans tous les cas (c'est-à-dire 'https: //')

if (strpos($aProfileInfo['Website'],'http://') === false){
    $aProfileInfo['Website'] = 'http://'.$aProfileInfo['Website'];
}
16

Je pense que vous feriez mieux d'utiliser la fonction intégrée parse_url() qui renvoie un tableau associatif avec ses composants

quelque chose comme cela fonctionnera pour vous:

 if  ( $ret = parse_url($url) ) {

      if ( !isset($ret["scheme"]) )
       {
       $url = "http://{$url}";
       }
}
42
David

Personnellement, j'utilise ceci, qui est partiellement tiré de la documentation php

$scheme = parse_url($link, PHP_URL_SCHEME);
if (empty($scheme)) {
    $link = 'http://' . ltrim($link, '/');
}
13
Satbir Kira

Il existe deux manières de résoudre ce problème: l’analyse d’URL et les expressions régulières.

Certains diront que l'analyse des URL est droite, mais les expressions régulières fonctionnent tout aussi bien dans ce cas. J'aime pouvoir avoir des lignes simples simples pour des choses comme celle-ci, en particulier parce que ce serait une occurrence commune dans les fichiers de modèle où vous pourriez avoir besoin d'une ligne unique dans une instruction echo pour maintenir la lisibilité.

Expressions régulières

Nous pouvons le faire en un seul appel de fonction avec preg_replace .

preg_replace('/^(?!https?:\/\/)/', 'http://', $aProfileInfo['Website'])

Ceci utilise un negative lookahead au début de la chaîne qui recherche http:// ou https://. Si l'un ou l'autre est trouvé, le remplacement ne se produit pas. S'ils ne sont pas trouvés, le début de la chaîne (0 caractères) est remplacé par http://, ce qui le précède généralement à la chaîne sans le modifier.

Dans le contexte:

<a href="'. preg_replace('/^(?!https?:\/\/)/', 'http://', $aProfileInfo['Website']).'" target="_self">
    <div class="callButton">Website</div>
</a>

Analyse d'URL

(parse_url($aProfileInfo['Website'], PHP_URL_SCHEME) ? '' : 'http://') . $aProfileInfo['Website']

Cela permet de savoir si un schéma est présent sur le lien via parse_url($aProfileInfo['Website'], PHP_URL_SCHEME). Ensuite, en utilisant un opérateur ternaire, il générera soit '' s’il en a été trouvé un, soit 'http://' s’il n’en a pas été trouvé. Ensuite, il ajoute le lien sur cela.

Dans le contexte:

<a href="'.((parse_url($aProfileInfo['Website'], PHP_URL_SCHEME) ? '' : 'http://') . $aProfileInfo['Website']).'" target="_self">
    <div class="callButton">Website</div>
</a>
8
Evan Kennedy

Vous pouvez utiliser strpos :

// Trim trailing whitespace
$aProfileInfo['Website'] = trim($aProfileInfo['Website']);

// Test if the string begins with "http://"
if (strpos($aProfileInfo['Website'], 'http://') !== 0) {
  $aProfileInfo['Website'] = 'http://' . $aProfileInfo['Website'];
}
3
mc10

Vous pouvez également prendre en compte que "http (s)" doit figurer au début de l'URL:

if (preg_match('/^https?:\/\//', $aProfileInfo['Website']) === 0) {
    $aProfileInfo['Website'] = 'http://'.$aProfileInfo['Website'];
}
1
ggonzal

Vous pouvez utiliser cette fonction comme général si rien dans le tableau ne se trouve dans la chaîne ajoutez-y quelque chose.

function httpify($link, $append = 'http://', $allowed = array('http://', 'https://')){

  $found = false;
  foreach($allowed as $protocol)
    if(strpos($link, $protocol) !== 0)
      $found = true;

  if($found)
    return $link;
  return $append.$link;
}
1
Hailwood

Voici un autre exemple avec string subttraction :

$changeLink = $myRow->site_url;
  if(substr($changeLink, 0, 7) != 'http://') {
     $changeLink = 'http://' . $changeLink;  
}

// ....

echo "<a href=\"" . $changeLink . "\" target=\"_blank\"></a>";
0
Porta Shqipe

Je crois La réponse de David est la bonne façon de faire ceci, mais cela peut être simplifié comme ceci

parse_url($aProfileInfo['Website'], PHP_URL_SCHEME)==''?'http://'.$aProfileInfo['Website']:$aProfileInfo['Website']
0
Nate

Quelque chose comme ça?

if (!strpos($aProfileInfo['Website'], 'http://')) {
    $aProfileInfo['Website'] = 'http://' . $aProfileInfo['Website'];
}
0
Fase