Sondan sonraki / URL'deki karakterleri alın


Yanıtlar:


267

Çok basit:

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

strrpos , eğik çizginin son geçtiği konumu alır; substr , bu konumdan sonraki her şeyi döndürür.


Redanimalwar tarafından belirtildiği gibi, eğer bölü işareti yoksa, strrposyanlış döndürdüğü için bu doğru çalışmaz . İşte daha sağlam bir versiyon:

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

Hiç eğik çizgi yoksa, bu ilk karakteri keser.
— redanimalwar

@redanimalwar ben başka bir çözüm eklendi
— DisgruntledGoat

9
Neden $str = basename($url)daha fazla oy almadığını merak ediyorum , benim için mükemmel çalışıyor.
— redanimalwar

2
@redanimalwar (1) basename, URL'ler için değil, dosya yolları için tasarlanmıştır - Sanırım her zaman aynı sonucu döndürecektir, ancak ters eğik çizgi gibi uç durumlar olabilir; (2) basename yalnızca bölü çizgileri için işe yarar, oysa cevabım başka biri aynı şeyi farklı bir karakterle yapmak isterse kolayca değiştirilebilir.
— DisgruntledGoat

Teşekkürler. Basit ve pratik !!
— Rodrigo Zuluaga

51
$str = basename($url);

1
Bu url'ler üzerinde çalışıyor mu? Baz adı dosya yolları için tasarlanmadı mı?
— random_user_name

2
İyi çalışıyor gibi görünüyor, bu bir dizge işlevi; yolun var olup olmadığını kontrol etmez.
— Gifford N.

14

Sen olabilir patlayabilir dayanan "/" ve son girişi verir:

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

Bu, ipin parçalanmasına dayanır, eğer ipin deseninin yakında değişmeyeceğini biliyorsanız gerekli olmayan bir şey. Alternatif olarak, bu değeri dizenin sonunda bulmak için normal bir ifade kullanabilirsiniz:

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

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

explodeNe kadar hızlı olduğunu görmek için zamanlamamama rağmen bana her zaman daha fazla yük gibi geliyor.
— DisgruntledGoat

Görünüşe göre explode () biraz daha yavaştır. 10k örneklerde bu, her ikisi için de geçen süredir. substr () birinci: 0,013657 / 0,045038
— Sampson

Daha yavaş olabilir ama burada patlamayı tercih ederim. Spesifik olarak, url herhangi bir "/" içermiyorsa, strrpos cevabındaki +1, bir karmaşanın üstesinden gelmesini sağlar.
— Noam

1
Örnek bir uyarı atar ve kesinlikle yeniden çalışılmalıdır.
— Xatenev

Evet, patlatılmış veriler değişken olmalıdır
— ymakux

11

Sen kullanabilirsiniz substrve strrchr:

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

Bunun gibi daha fazlası: ltrim (strrchr ($ url, "/"), "/"); strchr sayı değil, dizge döndürür
— Denis Chenu

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

3
benim sürümüm, sonuç, yayınlanan ile aynı olmasına rağmen, OP'nin isterse bölünme dizesinin diğer öğelerini kullanmasını sağlar.
— ghostdog74

bu doğru cevaptır, çünkü başlık url'de 'son' dan sonra sorar
— Fabiano Shark

1

array_pop(explode("/", "http://vimeo.com/1234567")); örnek url’nin son öğesini döndürür


php7 içinde döndürür dikkat edin: PHP Notice: Only variables should be passed by reference.
— billynoah

0

İki bir gömlek - Birincisinin daha hızlı olduğundan şüpheleniyorum, ancak ikincisi daha güzel ve farklıdır end()ve array_pop()bir işlevin sonucunu current(), işaretçiyi hareket ettirmediği veya diziyi değiştirmediği için herhangi bir uyarı veya uyarı oluşturmadan doğrudan iletebilirsiniz .

$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+ ve üzeri sürümlerde bu yolu kullanmak bir uyarı atacaktır. Dokümanlara göre: " Ona gerçek bir değişken iletmelisiniz, bir dizi döndüren bir işlev değil, çünkü yalnızca gerçek değişkenler referansla iletilebilir. "
— billynoah

-1

İşte url'nin veya yolun son bölümünü kaldırmak için yazdığım güzel bir dinamik işlev.

/**
 * 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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.