Làm cách nào để thêm http: // nếu nó không tồn tại trong URL?


110

Làm thế nào tôi có thể thêm http://vào một URL nếu nó chưa bao gồm một giao thức (ví dụ http://, https://hoặc ftp://)?

Thí dụ:

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

Nếu bạn có, mozilla.orgmột mình, làm thế nào bạn biết nếu nó nên http, httpshoặc ftp?
Anthony Forloney

7
@Anthony: anh ấy nói rằng anh ấy muốn thêm "http: //" nếu không có giao thức nào khác.
nickf

3
@Anthony Nhưng khi người dùng nhập url mà không có http: // hoặc bất cứ thứ gì, bạn có mong đợi nó là ftp: // hay gì đó không?
Ryan

Câu trả lời:


265

Phiên bản sửa đổi của mã @nickf:

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

Nhận ftp://, ftps://, http://https://theo một cách phân biệt dạng chữ.


5
Sau khi so sánh addhttp và addcheme bên dưới, tôi đã đi đến kết luận rằng addcheme tốt hơn về mặt hiệu suất: $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

Điều gì sẽ xảy ra nếu url bắt đầu bằng '//'?
holden321

@ holden321 Nó làm tôi nhớ đến bài thơ về Con voi đang bơi và trở lại như một con cá với tâm niệm ngăn cản bạn bằng mọi giá những việc có thể làm tổn thương bạn. Có rất nhiều người trên thế giới, và bạn biết đấy, bạn có những ý tưởng đáng kinh ngạc này và thứ bạn nghĩ còn thiếu chính là động lực, Nhưng điều đó không đúng. bởi vì cách mà tâm trí của chúng ta có dây và sự thật về con người là chúng ta không được thiết kế để làm những điều không thoải mái.
homerun

136

Tại thời điểm viết bài, không có câu trả lời nào sử dụng chức năng tích hợp cho việc này:

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"

Xem thêm: parse_url()


13
Đây phải là câu trả lời được chọn - tại sao lại tự học khi ngôn ngữ có hỗ trợ bản ngữ? Công việc tốt đẹp.
Tom Auger

2
Một cải tiến có thể được thực hiện với chức năng này là kiểm tra xem trường có giá trị hay không để nó không thêm http vào trường trống.
Randy Johnson

Điều này không hoạt động với các giao thức tương đối. ví dụecho addScheme('//google.com');
Taylan

2
@Taylan Vâng, bạn sẽ phảiltrim($url, '/')
Ja͢ck

51

Chỉ cần kiểm tra xem có giao thức nào không (được mô tả bằng ": //") và thêm "http: //" nếu không có.

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

Lưu ý : Đây có thể là một giải pháp đơn giản và dễ hiểu, nhưng câu trả lời của Jack sử dụng parse_urlgần như đơn giản và chắc chắn hơn nhiều. Bạn có thể nên sử dụng cái đó.


2

Câu trả lời tốt nhất cho điều này sẽ là một cái gì đó như thế này:

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

1

Quét chuỗi để tìm ://, nếu nó không có, hãy thêm trước vào http://chuỗi .., mọi thứ khác chỉ cần sử dụng chuỗi nguyên trạng.

Điều này sẽ hoạt động trừ khi bạn có chuỗi đầu vào rác.


Tôi thích phiên bản regex hơn :)
Ryan

3
Đừng quá vội vàng với regex. Regex có xu hướng khó đọc và nó có thể tạo ra một vấn đề / lỗi khác khi vấn đề phát triển.
Rosdi Kasim

0

giải pháp nickf được sửa đổi:

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

Tôi tin rằng ftps://cũng có giá trị.
Alix Axel

@Alix: không biết về điều đó. Đã chỉnh sửa.
kamasheto

0
<?php

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

?>

mã này sẽ thêm http: // vào URL nếu nó không có ở đó.


-1

Thử cái này. Không kín nước *, nhưng có thể đủ tốt:

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

*: nghĩa là, các tiền tố như "fttps: //" được coi là hợp lệ.


6
Điều này sẽ khớp (ergo trả về true và nếu sẽ đánh giá thành false) các kết hợp kỳ lạ .. như htps, fttps, fttp, htp, tôi đoán vậy.
kamasheto
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.