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.