Добавить http: // префикс в URL, если отсутствует

Привет, у меня очень простой код

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

Проблема в том, что если пользователь не вводит http: //, ссылка будет указывать на мой сайт, а не на внешний веб-сайт, как следует.

Как проверить PHP, если пользователь не ввел http: // и автоматически добавить его, когда его нет?

Простое решение, которое может не работать во всех случаях (например, https: // '):

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

Я думаю, вам лучше использовать встроенную функцию parse_url() которая возвращает ассоциативный массив с его компонентами

что-то вроде этого будет работать для вас:

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

Это будет обрабатывать http: // и https: //

 if (preg_match("#https?://#", $aProfileInfo['Website']) === 0) { $aProfileInfo['Website'] = 'http://'.$aProfileInfo['Website']; } 

Существует два способа решения этой проблемы: синтаксический анализ URL и регулярные выражения.

Некоторые скажут, что разбор URL правилен, но регулярные выражения работают так же хорошо в этом случае. Мне нравится иметь простые однострочные элементы для таких вещей, особенно потому, что это было бы обычным явлением в файлах шаблонов, где для обеспечения удобочитаемости вам может понадобиться один-лайнер внутри оператора эха.

Обычные выражения

Мы можем сделать это одним вызовом функции с preg_replace .

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

Это использует negative lookahead в начале строки, которая ищет http:// или https:// . Если они найдены, замена не выполняется. Если они не найдены, они заменяют начало строки (0 символов) на http:// существу, добавив это в строку без ее модификации.

В контексте:

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

Анализ URL-адресов

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

Что это делает, так это выяснить, присутствует ли схема в ссылке throught parse_url($aProfileInfo['Website'], PHP_URL_SCHEME) . Затем, используя тернарный оператор, он либо выдает '' если был найден один или 'http://' если он не был найден. Затем он добавляет ссылку на это.

В контексте:

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

Я лично использую это, что частично взято из php docs

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

Вы можете использовать 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']; } 

Вы можете использовать эту функцию как общее, если ничего из массива не найдено в строке, добавьте что-то к ней.

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

Вы также можете принять во внимание, что «http (s)» должно быть в начале URL-адреса:

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

Что-то вроде этого?

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

Вот еще один пример с вычитанием строк :

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

// ….

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

Я считаю, что ответ Дэвида – правильный способ сделать это, но его можно упростить следующим образом:

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