URLの最後の/後の文字を取得する


回答:


263

非常に簡単:

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

strrposは、最後に出現したスラッシュの位置を取得します。substrは、その位置以降のすべてを返します。


redanimalwarが述べたように、スラッシュがない場合strrposはfalseを返すため、これは正しく動作しません。これはより堅牢なバージョンです。

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

スラッシュがない場合、これは最初の文字のカットです。
redanimalwar 2015年

私は別のソリューションを追加@redanimalwar
DisgruntledGoat

8
なぜこれ$str = basename($url)以上の投票が得られないのか、疑問に思っています。
redanimalwar 2015年

1
@redanimalwar(1)ベース名はURLではなくファイルパス用です-常に同じ結果が返されると思いますが、バックスラッシュのようなエッジケースがあるかもしれません。(2)basenameはスラッシュでのみ機能しますが、誰かが別の文字で同じことをしたい場合、私の答えは簡単に変更できます。
DisgruntledGoat 2015年

ありがとう。シンプルで実用的!
ロドリゴズルアガ

50
$str = basename($url);

1
これはURLで機能しますか?ベース名はファイルパス用ではありませんか?
random_user_name 2013

2
正常に動作するようですが、これは文字列関数です。パスが存在するかどうかはチェックしません。
Gifford N.

14

「/」に基づいて爆発し、最後のエントリを返すことができます。

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

これは弦をばらばらにすることに基づいており、弦自体のパターンがすぐには変化しないことがわかっている場合は不要です。または、正規表現を使用して、その値を文字列の末尾に配置することもできます。

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

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

explode私にとっては常にオーバーヘッドのように思えますが、それがどれほど速いかを確認するために時間を計ったことはありません。
DisgruntledGoat

explode()は少し遅いようです。10kインスタンスでは、これは両方にかかる時間です。substr()最初:0.013657 / 0.045038
サンプソン

遅いかもしれませんが、私はここでの爆発を好みます。具体的には、URLに「/」が含まれていない場合、strrpos回答の+1によって混乱が解消されます。
ノーム2014年

1
この例は通知をスローするため、確実に再加工する必要があります。
Xatenev 2016年

はい、展開されたデータは変数でなければなりません
ymakux 2017

11

あなたは使用することができますsubstrstrrchr

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

これに似たもの:ltrim(strrchr($ url、 "/")、 "/"); strchrは数値ではなく文字列を返す
Denis Chenu

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

3
私のバージョンでは、最終結果は投稿されたものと同じですが、OPが望めば、分割された文字列の他のアイテムを使用できます。
ghostdog74

これは正解です。タイトルが「最後」の後に尋ねます/ URL内
Fabiano Shark '26

1

array_pop(explode("/", "http://vimeo.com/1234567")); サンプルURLの最後の要素を返します


php7での戻り通知:PHP Notice: Only variables should be passed by reference
ビリーノア2017年

0

2つの1ライナー-最初の方が速いend()array_pop()思いますが、2番目の方がきれいです。これとは異なりcurrent()、ポインターを移動したり配列を変更したりしないため、通知や警告を生成せずに関数の結果を直接渡すことができます。

$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以降でこの方法を使用すると、通知がスローされます。ドキュメントによると、「実際の変数のみが参照で渡される可能性があるため、配列を返す関数ではなく、実際の変数を渡す必要があります。
ビリーノア

-1

これは、URLまたはパスの最後の部分を削除するために私が書いた美しい動的関数です。

/**
 * 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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.