รับอักขระหลังสุดท้าย / ใน url


123

ฉันต้องการรับอักขระหลังสุดท้าย / ใน url เช่น http://www.vimeo.com/1234567

ฉันจะทำอย่างไรกับ php?


คุณอาจพบว่ามีs($str)->afterLast('/')ประโยชน์ดังที่พบในไลบรารีแบบสแตนด์อโลนนี้
caw

คำตอบ:


267

ง่ายมาก:

$id = substr($url, strrpos($url, '/') + 1);

strrposได้รับตำแหน่งของการเกิดครั้งสุดท้ายของสแลช substrส่งคืนทุกอย่างหลังจากตำแหน่งนั้น


ดังที่กล่าวไว้โดย redanimalwar หากไม่มีเครื่องหมายทับสิ่งนี้ทำงานไม่ถูกต้องเนื่องจากstrrposส่งคืนเท็จ นี่คือเวอร์ชันที่มีประสิทธิภาพมากขึ้น:

$pos = strrpos($url, '/');
$id = $pos === false ? $url : substr($url, $pos + 1);

สิ่งนี้จะตัดอักขระตัวแรกหากไม่มีเครื่องหมายทับเลย
redanimalwar

@redanimalwar ฉันได้เพิ่มโซลูชันอื่น
DisgruntledGoat

9
ฉันสงสัยว่าเหตุใดจึง$str = basename($url)ไม่ได้รับการโหวตเพิ่มขึ้นทำงานได้ดีอย่างสมบูรณ์สำหรับฉัน
redanimalwar

2
@redanimalwar (1) basename มีไว้สำหรับเส้นทางไฟล์ไม่ใช่ URL - ฉันคิดว่ามันจะให้ผลลัพธ์เหมือนกันเสมอ แต่อาจมีขอบกรณีเช่นแบ็กสแลช (2) ชื่อฐานใช้งานได้กับเครื่องหมายทับเท่านั้นในขณะที่คำตอบของฉันสามารถแก้ไขได้ง่ายหากมีคนอื่นต้องการทำสิ่งเดียวกันโดยใช้อักขระอื่น
แพะไม่พอใจ

ขอบคุณ เรียบง่ายใช้ได้จริง !!
Rodrigo Zuluaga

51
$str = basename($url);

1
สิ่งนี้ใช้ได้กับ URL หรือไม่ ชื่อฐานไม่ได้มีไว้สำหรับเส้นทางไฟล์ใช่หรือไม่?
random_user_name

2
ดูเหมือนจะทำงานได้ดีมันเป็นฟังก์ชันสตริง ไม่ได้ตรวจสอบว่ามีเส้นทางอยู่หรือไม่
Gifford N.

14

คุณสามารถระเบิดตาม "/" และส่งคืนรายการสุดท้าย:

print end( explode( "/", "http://www.vimeo.com/1234567" ) );

ซึ่งขึ้นอยู่กับการแยกสตริงออกจากกันสิ่งที่ไม่จำเป็นหากคุณรู้ว่ารูปแบบของสตริงจะไม่เปลี่ยนแปลงในไม่ช้า คุณสามารถใช้นิพจน์ทั่วไปเพื่อค้นหาค่านั้นที่ส่วนท้ายของสตริง:

$url = "http://www.vimeo.com/1234567";

if ( preg_match( "/\d+$/", $url, $matches ) ) {
    print $matches[0];
}

explodeดูเหมือนว่าจะมีค่าใช้จ่ายมากกว่าสำหรับฉันเสมอแม้ว่าฉันจะไม่เคยจับเวลาเพื่อดูว่ามันเร็วแค่ไหน
แพะไม่พอใจ

ดูเหมือนว่าระเบิด () จะช้ากว่าเล็กน้อย ในอินสแตนซ์ 10k นี่คือระยะเวลาที่ใช้สำหรับทั้งสองอย่าง substr () แรก: 0.013657 / 0.045038
Sampson

อาจจะช้ากว่า แต่ฉันชอบระเบิดที่นี่มากกว่า โดยเฉพาะอย่างยิ่งถ้า url ไม่มี "/" ใด ๆ +1 ในคำตอบ strpos จะทำให้เกิดความยุ่งเหยิงขึ้นก็สามารถเอาชนะได้
Noam

1
ตัวอย่างมีการแจ้งให้ทราบล่วงหน้าและควรได้รับการแก้ไขอย่างแน่นอน
Xatenev

ใช่ข้อมูลที่ระเบิดต้องเป็นตัวแปร
ymakux


8
$str = "http://www.vimeo.com/1234567";
$s = explode("/",$str);
print end($s);

3
เวอร์ชันของฉันแม้ว่าผลลัพธ์สุดท้ายจะเหมือนกับที่โพสต์ไว้ แต่ก็ทำให้ OP สามารถใช้รายการอื่น ๆ ของสตริงที่แยกได้หากต้องการ
ghostdog74

นี่คือคำตอบที่ถูกต้องเนื่องจากชื่อจะถามหลัง 'last' / ใน url
Fabiano Shark

1

array_pop(explode("/", "http://vimeo.com/1234567")); จะส่งคืนองค์ประกอบสุดท้ายของ url ตัวอย่าง


ใน php7 PHP Notice: Only variables should be passed by referenceผลตอบแทนที่ทราบ:
billynoah

0

Two one liners - ฉันสงสัยว่าอันแรกเร็วกว่า แต่อันที่สองสวยกว่าและไม่เหมือนend()และarray_pop()คุณสามารถส่งผ่านผลลัพธ์ของฟังก์ชั่นได้โดยตรงcurrent()โดยไม่ต้องแจ้งหรือเตือนใด ๆ เนื่องจากมันไม่ได้ย้ายตัวชี้หรือเปลี่ยนแปลงอาร์เรย์

$var = 'http://www.vimeo.com/1234567';

// VERSION 1 - one liner simmilar to DisgruntledGoat's answer above
echo substr($a,(strrpos($var,'/') !== false ? strrpos($var,'/') + 1 : 0));

// VERSION 2 - explode, reverse the array, get the first index.
echo current(array_reverse(explode('/',$var)));

@redburn ใช้end()วิธีนี้ใน php 5.4+ ขึ้นไปจะแจ้งให้ทราบ ตามเอกสาร: " คุณต้องส่งผ่านตัวแปรจริงไม่ใช่ฟังก์ชันที่ส่งคืนอาร์เรย์เนื่องจากตัวแปรจริงเท่านั้นที่สามารถส่งผ่านโดยการอ้างอิง "
billynoah

-1

นี่คือฟังก์ชั่นไดนามิกที่สวยงามที่ฉันเขียนเพื่อลบส่วนสุดท้ายของ url หรือ path

/**
 * remove the last directories
 *
 * @param $path the path
 * @param $level number of directories to remove
 *
 * @return string
 */
private function removeLastDir($path, $level)
{
    if(is_int($level) && $level > 0){
        $path = preg_replace('#\/[^/]*$#', '', $path);
        return $this->removeLastDir($path, (int) $level - 1);
    }
    return $path;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.