Dapatkan karakter setelah terakhir / dalam url

123

Saya ingin mendapatkan karakter setelah / terakhir di url seperti http://www.vimeo.com/1234567

Bagaimana saya melakukannya dengan php?

Johan
sumber
Anda mungkin merasa s($str)->afterLast('/')terbantu, seperti yang ditemukan di perpustakaan mandiri ini .
gak

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);
Kambing Tidak Puas
sumber
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);
GZipp
sumber
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];
}
Sampson
sumber
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
Gabriel
sumber
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);
anjing hantu74
sumber
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

nikc.org
sumber
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)));
billynoah
sumber
@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;
}
Mahmoud Zalt
sumber