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


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

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

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

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

Author: Akhil Jain, 2011-06-05

10 answers

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

if (strpos($aProfileInfo['Website'],'http://') === false){
    $aProfileInfo['Website'] = 'http://'.$aProfileInfo['Website'];
}
 15
Author: Christopher Armstrong, 2011-06-05 01:18:22

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

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

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

      if ( !isset($ret["scheme"]) )
       {
       $url = "http://{$url}";
       }
}
 39
Author: David, 2012-12-10 07:09:38

Я лично использую это, которое частично взято из документов php

$scheme = parse_url($link, PHP_URL_SCHEME);
if (empty($scheme)) {
    $link = 'http://' . ltrim($link, '/');
}
 10
Author: Satbir Kira, 2015-11-18 10:11:14

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

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

Регулярные выражения

Мы можем сделать это в одиночный вызов функции с помощью 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']

Что это делает, так это выясняет, присутствует ли схема на ссылка через 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>
 7
Author: Evan Kennedy, 2015-07-21 21:18:30

Вы могли бы использовать 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
Author: mc10, 2011-06-05 01:20:05

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

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
Author: Hailwood, 2011-06-05 01:25:48

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

if (preg_match('/^https?:\/\//', $aProfileInfo['Website']) === 0) {
    $aProfileInfo['Website'] = 'http://'.$aProfileInfo['Website'];
}
 1
Author: ggonzal, 2015-07-01 14:34:04

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

if (!strpos($aProfileInfo['Website'], 'http://')) {
    $aProfileInfo['Website'] = 'http://' . $aProfileInfo['Website'];
}
 0
Author: Fase, 2011-06-05 01:21:10

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

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

// ....

echo "<a href=\"" . $changeLink . "\" target=\"_blank\"></a>";
 0
Author: Porta Shqipe, 2014-01-02 13:51:09

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

parse_url($aProfileInfo['Website'], PHP_URL_SCHEME)==''?'http://'.$aProfileInfo['Website']:$aProfileInfo['Website']
 0
Author: Nate, 2017-05-23 11:54:33