2010-05-04 5 views
93

Как добавить http:// к URL-адресу, если он еще не содержит протокол (например, http://, https:// или ftp://)?Как добавить http: //, если он не существует в URL-адресе?

Пример:

addhttp("google.com"); // http://google.com 
addhttp("www.google.com"); // http://www.google.com 
addhttp("google.com"); // http://google.com 
addhttp("ftp://google.com"); // ftp://google.com 
addhttp("https://google.com"); // https://google.com 
addhttp("http://google.com"); // http://google.com 
addhttp("rubbish"); // http://rubbish 
+0

Если вы имели, ' mozilla.org', как бы вы знали, должно ли это быть, 'http',' https' или 'ftp'? –

+6

@ Энтони: он говорит, что хочет добавить «http: //», если нет другого протокола. – nickf

+3

@ Энтони Но когда пользователь вводит URL-адрес без http: // или что-то еще, вы ожидаете, что он будет ftp: // или что-то еще? – Ryan

ответ

228

Модифицированная версия @nickf кода:

function addhttp($url) { 
    if (!preg_match("~^(?:f|ht)tps?://~i", $url)) { 
     $url = "http://" . $url; 
    } 
    return $url; 
} 

признает ftp://, ftps://, http:// и https:// в случае нечувствительной способом.

+0

Спасибо Alix, лучшая & рабочая версия за вами :) – Ryan

+1

@David: Без проблем, пожалуйста. –

+4

Сравнивая addhttp и addhemhem ниже, я пришел к выводу, что addscheme лучше с точки зрения производительности: '$ url =" www.google.com "; $ init = microtime (true); для ($ i = 1; $ i <100000; $ i ++) { \t addScheme ($ url); } echo microtime (true) - $ init; echo "
"; $ init = microtime (true); для ($ i = 1; $ i <100000; $ i ++) { \t addhttp ($ url); } echo microtime (true) - $ init; ' –

-1

Попробуйте это. Не водонепроницаемые *, но может быть достаточно хорошими:

function addhttp($url) { 
    if (!preg_match("@^[hf]tt?ps?://@", $url)) { 
     $url = "http://" . $url; 
    } 
    return $url; 
} 

*: то есть, префиксы как "fttps: //" рассматриваются как действительные.

+5

Это будет соответствовать (ergo return true и if будет оценивать значение false) странные комбинации.как htps, fttps, fttp, htp, я думаю. – kamasheto

+0

Мой совет любому, кто читает это ..., вероятно, не использует это. –

0

nickf раствор модифицированного:

function addhttp($url) { 
    if (!preg_match("@^https?://@i", $url) && !preg_match("@^ftps?://@i", $url)) { 
     $url = "http://" . $url; 
    } 
    return $url; 
} 
+0

Я верю, что 'ftps: //' также действителен. –

+0

@Alix: не знал об этом. Ред. – kamasheto

2

Сканирование строки для ://, если у нее ее нет, добавьте http:// в строку .., все остальное просто используйте строку как есть.

Это будет работать, если у вас нет входной строки мусора.

+0

i'de предпочитает регулярное выражение :) – Ryan

+3

Не будьте слишком быстрые в регулярном выражении. Regex, как правило, трудно читать, и он может ввести еще одну проблему/ошибку, как только проблема будет возрастать. –

48

Просто проверьте, существует ли протокол (обозначается символом «: //») и добавьте «http: //», если этого не произошло.

if (false === strpos($url, '://')) { 
    $url = 'http://' . $url; 
} 

Примечание: Это может быть простым и простое решение, но ответ Джека используя parse_url почти так же просто и гораздо более надежными. Вероятно, вы должны использовать этот.

+5

+1 для того, чтобы быть наиболее читаемым решением для всех. Намерение программиста быстро понято с первого взгляда. –

+2

как насчет таких ссылок-магнит:? Fh = sdfs ... – holden321

+0

+1 для самого простого решения –

0
<?php 

if (!preg_match("/^(http|ftp):/", $_POST['url'])) { 
    $_POST['url'] = 'http://'.$_POST['url']; 
} 
$url = $_POST['url']; 

?> 

Этот код добавит http: // к URL-адресу, если его там нет.

101

На момент написания, ни один из ответов не использовали встроенную функцию для этого:

function addScheme($url, $scheme = 'http://') 
{ 
    return parse_url($url, PHP_URL_SCHEME) === null ? 
    $scheme . $url : $url; 
} 

echo addScheme('google.com'); // "http://google.com" 
echo addScheme('https://google.com'); // "https://google.com" 

Смотрите также: parse_url()

+9

Это должен быть выбранный ответ - зачем катиться самостоятельно, когда язык имеет встроенную поддержку? Хорошая работа. –

+1

Одним из улучшений, которые могут быть сделаны с помощью этой функции, является проверка того, имеет ли поле значение, поэтому оно не добавляет http в пустое поле. –

+0

Это не работает с относительными протоколами. например 'echo addScheme ('// google.com');' – Taylan

-4

использовать prep_url ($ URL);

$url = prep_url($url); 

если проверить, если HTTP является существование ничего не произойдет в противном случае это добавить HTTP: //

+1

Это вспомогательная функция codeigniter. Что делать, если вы не используете эту инфраструктуру? –

1

Лучший ответ на это было бы что-то вроде этого:

function addhttp($url) 
{ 
    return $url = empty(parse_url($url)['scheme']) ? 'http://' . ltrim($url, '/') : $url; 
} 
Смежные вопросы