Nhận các ký tự sau url cuối cùng / trong url


Câu trả lời:


265

Rất đơn giản:

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

strrpos nhận vị trí của lần xuất hiện cuối cùng của dấu gạch chéo; substr trả về mọi thứ sau vị trí đó.


Như đã đề cập bởi redanimalwar nếu không có dấu gạch chéo, nó không hoạt động chính xác vì strrpostrả về false. Đây là một phiên bản mạnh mẽ hơn:

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

Việc cắt ký tự đầu tiên này nếu không có dấu gạch chéo nào cả.
redanimalwar

@redanimalwar Tôi đã thêm một giải pháp khác
DisgruntledGoat

9
Tôi tự hỏi tại sao $str = basename($url)không nhận được nhiều ủng hộ hơn, hoạt động hoàn toàn tốt cho tôi.
redanimalwar

2
@redanimalwar (1) basename dành cho đường dẫn tệp, không phải URL - Tôi nghĩ rằng nó sẽ luôn trả về cùng một kết quả nhưng có thể có các trường hợp cạnh như dấu gạch chéo ngược; (2) tên cơ sở chỉ hoạt động cho các dấu gạch chéo trong khi câu trả lời của tôi có thể dễ dàng sửa đổi nếu người khác muốn làm điều tương tự với một ký tự khác.
DisgruntledGoat

Cảm ơn. Đơn giản và thực tế !!
Rodrigo Zuluaga

51
$str = basename($url);

1
Điều này có hoạt động trên url không? Tên cơ sở không dành cho đường dẫn tệp?
random_user_name

2
Có vẻ hoạt động tốt, Đó là một hàm chuỗi; nó không kiểm tra xem đường dẫn có tồn tại hay không.
Gifford N.

14

Bạn có thể phát nổ dựa trên "/" và trả lại mục nhập cuối cùng:

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

Đó là dựa trên việc thổi sợi dây ra xa nhau, điều không cần thiết nếu bạn biết bản thân mẫu của dây sẽ không sớm thay đổi. Ngoài ra, bạn có thể sử dụng một biểu thức chính quy để xác định giá trị đó ở cuối chuỗi:

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

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

explodeVới tôi luôn luôn có vẻ như không cần thiết, mặc dù tôi chưa bao giờ đếm thời gian để xem nó nhanh như thế nào.
DisgruntledGoat

Nó có vẻ bùng nổ () chậm hơn một chút. Trên 10k trường hợp, đây là khoảng thời gian cần thiết cho cả hai. substr () đầu tiên: 0,013657 / 0,045038
Sampson

Có thể chậm hơn, nhưng tôi thích sự bùng nổ ở đây hơn. Cụ thể là nếu url không chứa bất kỳ "/" nào thì +1 trong câu trả lời strrpos làm cho một mớ hỗn độn bùng nổ có thể khắc phục được.
Noam

1
Ví dụ đưa ra một thông báo và chắc chắn sẽ được làm việc lại.
Xatenev

Vâng, dữ liệu nổ phải là một biến
ymakux

11

Bạn có thể sử dụng substrstrrchr:

$url = 'http://www.vimeo.com/1234567';
$str = substr(strrchr($url, '/'), 1);
echo $str;      // Output: 1234567

Giống như thế này: ltrim (strrchr ($ url, "/"), "/"); strchr trả về một chuỗi, không phải là một số
Denis Chenu

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

3
phiên bản của tôi, mặc dù kết quả cuối cùng giống như kết quả đã đăng, cho phép OP sử dụng các mục khác của chuỗi phân tách nếu anh ta muốn.
ghostdog 74

đây là câu trả lời chính xác, vì tiêu đề hỏi sau url 'cuối cùng' / in
Fabiano Shark

1

array_pop(explode("/", "http://vimeo.com/1234567")); sẽ trả về phần tử cuối cùng của url mẫu


trong php7 Returns chú ý: PHP Notice: Only variables should be passed by reference.
billynoah

0

Hai lớp lót một - tôi nghi ngờ cái đầu tiên nhanh hơn nhưng cái thứ hai đẹp hơn và không giống end()array_pop(), bạn có thể chuyển trực tiếp kết quả của một hàm current()mà không tạo ra bất kỳ thông báo hoặc cảnh báo nào vì nó không di chuyển con trỏ hoặc thay đổi mảng.

$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, Sử dụng end()cách này trong php 5.4+ trở lên sẽ đưa ra thông báo. Theo tài liệu: " bạn phải chuyển cho nó một biến thực chứ không phải một hàm trả về một mảng vì chỉ các biến thực tế mới có thể được truyền bằng tham chiếu. ".
billynoah

-1

Đây là một hàm động tuyệt đẹp mà tôi đã viết để xóa phần cuối cùng của url hoặc đường dẫn.

/**
 * 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;
}
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.