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?
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'];
}
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}";
}
}
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, '/');
}
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é.
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>
(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>
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'];
}
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'];
}
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;
}
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>";
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']
Quelque chose comme ça?
if (!strpos($aProfileInfo['Website'], 'http://')) {
$aProfileInfo['Website'] = 'http://' . $aProfileInfo['Website'];
}