Dapatkan karakter setelah terakhir / dalam url


Jawaban:


265

Sangat sederhana:

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

strrpos mendapatkan posisi kemunculan terakhir dari garis miring; substr mengembalikan semuanya setelah posisi itu.


Seperti yang disebutkan oleh redanimalwar jika tidak ada garis miring, ini tidak berfungsi dengan benar karena strrposmengembalikan salah. Ini versi yang lebih kuat:

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

Ini memotong karakter pertama jika tidak ada garis miring sama sekali.
redanimalwar

@redanimalwar Saya menambahkan solusi lain
DisgruntledGoat

9
Saya bertanya-tanya mengapa $str = basename($url)tidak mendapatkan lebih banyak suara positif, berfungsi dengan baik untuk saya.
redanimalwar

2
@redanimalwar (1) basename ditujukan untuk jalur file, bukan URL - Saya pikir itu akan selalu mengembalikan hasil yang sama tetapi mungkin ada kasus tepi seperti garis miring terbalik; (2) basename hanya berfungsi untuk garis miring sedangkan jawaban saya dapat dengan mudah diubah jika orang lain ingin melakukan hal yang sama dengan karakter yang berbeda.
DisgruntledGoat

Terima kasih. Sederhana dan praktis !!
Rodrigo Zuluaga

51
$str = basename($url);

1
Apakah ini berfungsi pada url? Bukankah nama dasar ditujukan untuk jalur file?
random_user_name

2
Tampaknya berfungsi dengan baik, Ini adalah fungsi string; itu tidak memeriksa apakah jalur itu ada.
Gifford N.

14

Anda bisa meledak berdasarkan "/", dan mengembalikan entri terakhir:

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

Itu didasarkan pada meniup senar hingga terpisah, sesuatu yang tidak perlu jika Anda tahu pola senar itu sendiri tidak akan segera berubah. Sebagai alternatif, Anda dapat menggunakan ekspresi reguler untuk menemukan nilai tersebut di akhir string:

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

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

explodeselalu tampak seperti lebih membebani saya, meskipun saya belum pernah menghitung waktunya untuk melihat seberapa cepatnya.
DisgruntledGoat

Tampaknya meledak () sedikit lebih lambat. Pada 10 ribu kasus, ini adalah jumlah waktu yang dibutuhkan untuk keduanya. substr () pertama: 0,013657 / 0,045038
Sampson

Mungkin lebih lambat, tapi saya lebih suka meledak di sini. Khususnya jika url tidak mengandung "/" maka +1 pada jawaban strrpos membuat kekacauan meledak mampu diatasi.
Noam

1
Contoh tersebut memberikan pemberitahuan dan harus dikerjakan ulang.
Xatenev

Ya, data yang diledakkan harus berupa variabel
ymakux

11

Anda dapat menggunakan substrdan strrchr:

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

Lainnya seperti ini: ltrim (strrchr ($ url, "/"), "/"); strchr mengembalikan sebuah string, bukan angka
Denis Chenu

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

3
versi saya, meskipun hasil akhirnya sama dengan yang diposting, memungkinkan OP untuk menggunakan item lain dari string terpisah jika dia mau.
ghostdog74

ini adalah jawaban yang benar, karena judul menanyakan 'terakhir' / di url
Fabiano Shark

1

array_pop(explode("/", "http://vimeo.com/1234567")); akan mengembalikan elemen terakhir dari contoh url


di php7 Returns melihat: PHP Notice: Only variables should be passed by reference.
billynoah

0

Dua satu liner - Saya menduga yang pertama lebih cepat tetapi yang kedua lebih cantik dan tidak seperti end()dan array_pop(), Anda dapat meneruskan hasil dari suatu fungsi secara langsung ke current()tanpa menghasilkan pemberitahuan atau peringatan apa pun karena itu tidak memindahkan penunjuk atau mengubah array.

$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, Menggunakan end()cara ini di php 5.4+ dan yang lebih baru akan memberi tahu. Menurut docs: " Anda harus meneruskan variabel nyata dan bukan fungsi yang mengembalikan array karena hanya variabel aktual yang dapat diteruskan oleh referensi. ".
billynoah

-1

Inilah fungsi dinamis yang indah yang saya tulis untuk menghapus bagian terakhir dari url atau jalur.

/**
 * 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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.