URL에 http : //가없는 경우 어떻게 추가합니까?


110

어떻게 추가 할 수 있습니다 http://이미 프로토콜 (예 : 포함되지 않는 경우 URL에 http://, https://또는 ftp://)?

예:

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

만약 당신이 mozilla.org혼자라면 http,, https또는 ftp?
Anthony Forloney 2010 년

7
@Anthony : 그는 다른 프로토콜이 없으면 "http : //"를 추가하고 싶다고 말합니다.
nickf

3
@Anthony 그러나 사용자가 http : // 또는 아무것도없이 URL을 입력 할 때 ftp : // 또는 무언가가 될 것으로 예상합니까?
Ryan

답변:


265

@nickf 코드의 수정 된 버전 :

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

인식 ftp://, ftps://, http://https://사례를 구분 방법이다.


5
아래의 addhttp와 addcheme을 비교 한 결과, 성능 측면에서 addingcheme이 더 좋다는 결론에 도달했습니다. $url = "www.google.com"; $init = microtime(true); for( $i = 1; $i < 100000; $i++ ) { addScheme( $url ); } echo microtime(true) - $init; echo "<BR>"; $init = microtime(true); for( $i = 1; $i < 100000; $i++ ) { addhttp( $url ); } echo microtime(true) - $init;
Luis Lobo Borobia

URL이 '//'로 시작하면 어떻게됩니까?
holden321

@ holden321 수영하러 갔다가 물고기로 돌아온 코끼리에 대한시를 생각 나게합니다. 세상에는 너무나 많은 사람들이 있습니다. 여러분은이 놀라운 아이디어를 가지고 있고 여러분이 놓치고 있다고 생각하는 것은 동기 부여입니다.하지만 그것은 사실이 아닙니다. 우리의 마음이 연결되어 있고 인간에 대한 사실은 우리가 편안하지 않은 일을하도록 설계하지 않았기 때문입니다.
홈런

136

작성 당시에는 이에 대한 내장 함수를 사용하는 답변이 없습니다.

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()


13
이 답변이 선택되어야합니다. 언어가 네이티브 지원을받을 때 왜 직접 답변합니까? 잘 하셨어요.
Tom Auger

2
이 함수로 만들 수있는 한 가지 개선 사항은 필드에 값이 있는지 확인하여 빈 필드에 http를 추가하지 않는 것입니다.
Randy Johnson

이것은 상대 프로토콜에서 작동하지 않습니다. 예echo addScheme('//google.com');
Taylan 2016 년

2
그래 @Taylan, 당신은해야 할 것입니다ltrim($url, '/')

51

프로토콜 ( ": //"로 표시)이 있는지 확인하고 없으면 "http : //"를 추가하십시오.

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

참고 : 이것은 간단하고 직접적인 솔루션 일 수 있지만 사용하는 Jack의 대답 parse_url은 거의 비슷하고 훨씬 더 강력합니다. 아마 그것을 사용해야 할 것입니다.


2

이에 대한 최상의 답변은 다음과 같습니다.

function addhttp($url) 
{
  return $url = empty(parse_url($url)['scheme']) ? 'http://' . ltrim($url, '/') : $url;
}

1

문자열을 스캔하고 ://없는 경우 문자열 앞에 추가 http://합니다. 나머지는 문자열을 그대로 사용합니다.

이것은 쓰레기 입력 문자열이 없으면 작동합니다.


나는 정규식 버전을 선호한다 :)
Ryan

3
정규식에 너무 빠르지 마십시오. Regex는 읽기 어려운 경향이 있으며 문제가 커지면 또 다른 문제 / 버그가 발생할 수 있습니다.
Rosdi Kasim

0

nickf 솔루션 수정 :

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

나는 ftps://또한 유효 하다고 믿는다 .
Alix Axel

@Alix : 그 사실을 몰랐습니다. 편집.
kamasheto 2010 년

0
<?php

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

?>

이 코드는 URL이없는 경우 http : //를 URL에 추가합니다.


-1

이 시도. 방수 *는 아니지만 충분할 수 있습니다.

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

*: 즉, "fttps : //"와 같은 접두사는 유효한 것으로 취급됩니다.


6
이것은 htps, fttps, fttp, htp와 같은 이상한 조합과 일치합니다 (ergo가 true를 반환하고 false로 평가되면).
kamasheto
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.