จะเพิ่ม http: // ได้อย่างไรหากไม่มีอยู่ใน URL


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

7
@Anthony: เขาบอกว่าต้องการเพิ่ม "http: //" ถ้าไม่มีโปรโตคอลอื่น
nickf

3
@Anthony แต่เมื่อผู้ใช้พิมพ์ url โดยไม่มี http: // หรืออะไรก็ตามคุณคาดว่ามันจะเป็น 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 และ addscheme ด้านล่างฉันได้ข้อสรุปว่า addscheme ดีกว่าในแง่ของประสิทธิภาพ: $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 มันทำให้ฉันนึกถึงบทกวีเกี่ยวกับช้างที่ไปว่ายน้ำและกลับมาเป็นปลาด้วยความคิดที่จะหยุดคุณโดยเสียค่าใช้จ่ายทั้งหมดจากการทำและสิ่งที่อาจทำร้ายคุณ มีผู้คนมากมายในโลกนี้และคุณก็รู้ว่าคุณมีความคิดที่เหลือเชื่อนี้และสิ่งที่คุณคิดว่าขาดหายไปคือแรงจูงใจ แต่นั่นไม่เป็นความจริง เพราะวิธีที่จิตใจของเรามีสายและข้อเท็จจริงเกี่ยวกับมนุษย์คือเราไม่ได้ออกแบบให้ทำในสิ่งที่ไม่สะดวกสบาย
homerun

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

2
@Taylan ใช่คุณจะต้องltrim($url, '/')
Ja͢ck

51

เพียงตรวจสอบว่ามีโปรโตคอล (กำหนดโดย ": //") และเพิ่ม "http: //" หากไม่มี

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

หมายเหตุ : นี่อาจเป็นวิธีแก้ปัญหาที่ง่ายและตรงไปตรงมา แต่คำตอบของแจ็คที่ใช้parse_urlนั้นแทบจะเรียบง่ายและมีประสิทธิภาพมากกว่า คุณน่าจะใช้อันนั้น


2

คำตอบที่ดีที่สุดสำหรับสิ่งนี้จะเป็นดังนี้:

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

1

สแกนสตริงเพื่อหา://ถ้าไม่มีhttp://ให้นำหน้าสตริง .. ทุกอย่างอื่นก็ใช้สตริงตามที่เป็นอยู่

วิธีนี้จะใช้งานได้เว้นแต่คุณจะมีสตริงการป้อนขยะ


ฉันชอบเวอร์ชัน regex :)
Ryan

3
อย่าด่วนสรุปกับ regex 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

0
<?php

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

?>

รหัสนี้จะเพิ่ม http: // ให้กับ URL หากไม่มี


-1

ลองทำตามนี้ ไม่กันน้ำ*แต่อาจจะดีพอ:

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

*: นั่นคือคำนำหน้าเช่น "fttps: //" ถือว่าถูกต้อง


6
สิ่งนี้จะตรงกัน (ergo return true และถ้าจะประเมินเป็นเท็จ) ชุดค่าผสมแปลก ๆ .. เช่น htps, fttps, fttp, htp ฉันเดา
kamasheto
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.