Добавьте префикс http:// к URL-адресу, если он отсутствует
Здравствуйте, у меня очень простой код
<a href="'.$aProfileInfo['Website'].'" target="_self">
<div class="callButton">Website</div>
</a>
Проблема в том, что если пользователь не введет http://, ссылка будет указывать на мой веб-сайт, а не на внешний веб-сайт, как это должно быть.
Как мне проверить PHP, если пользователь не ввел http:// и автоматически добавить его, когда его там нет?
10 answers
Простое решение, которое может работать не во всех случаях (т. Е. "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}";
}
}
Я лично использую это, которое частично взято из документов php
$scheme = parse_url($link, PHP_URL_SCHEME);
if (empty($scheme)) {
$link = 'http://' . ltrim($link, '/');
}
Существует два способа решения этой проблемы: синтаксический анализ 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>
Вы могли бы использовать 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(ы)" должен быть в начале URL-адреса:
if (preg_match('/^https?:\/\//', $aProfileInfo['Website']) === 0) {
$aProfileInfo['Website'] = 'http://'.$aProfileInfo['Website'];
}
Что-то вроде этого?
if (!strpos($aProfileInfo['Website'], 'http://')) {
$aProfileInfo['Website'] = 'http://' . $aProfileInfo['Website'];
}
Я считаю, что Ответ Дэвида является правильным способом сделать это, но его можно упростить следующим образом:
parse_url($aProfileInfo['Website'], PHP_URL_SCHEME)==''?'http://'.$aProfileInfo['Website']:$aProfileInfo['Website']