Holen Sie sich Zeichen nach der letzten / in URL


Antworten:


263

Ganz einfach:

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

strrpos erhält die Position des letzten Auftretens des Schrägstrichs; substr gibt alles nach dieser Position zurück.


Wie von redanimalwar erwähnt, funktioniert dies nicht richtig, wenn kein Schrägstrich vorhanden ist, da strrposfalse zurückgegeben wird. Hier ist eine robustere Version:

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

Dies schneidet das erste Zeichen, wenn es überhaupt keinen Schrägstrich gibt.
Redanimalwar

@redanimalwar Ich habe eine andere Lösung
DisgruntledGoat

8
Ich frage mich, warum das $str = basename($url)nicht mehr Upvotes bekommt, funktioniert für mich einwandfrei.
Redanimalwar

1
@redanimalwar (1) basename ist für Dateipfade gedacht, nicht für URLs. Ich denke, es wird immer das gleiche Ergebnis zurückgegeben, aber es kann Randfälle wie Backslashes geben. (2) Der Basisname funktioniert nur bei Schrägstrichen, während meine Antwort leicht geändert werden kann, wenn jemand anderes dasselbe mit einem anderen Charakter tun möchte.
DisgruntledGoat

Vielen Dank. Einfach und praktisch !!
Rodrigo Zuluaga

50
$str = basename($url);

1
Funktioniert das bei URLs? Ist der Basisname nicht für Dateipfade vorgesehen?
random_user_name

2
Scheint gut zu funktionieren. Es ist eine String-Funktion. Es wird nicht überprüft, ob der Pfad vorhanden ist.
Gifford N.

14

Sie könnten basierend auf "/" explodieren und den letzten Eintrag zurückgeben:

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

Das basiert darauf, dass die Saite auseinandergeblasen wird. Dies ist nicht erforderlich, wenn Sie wissen, dass sich das Muster der Saite selbst nicht bald ändern wird. Alternativ können Sie einen regulären Ausdruck verwenden, um diesen Wert am Ende der Zeichenfolge zu suchen:

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

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

explodescheint mir immer mehr Aufwand zu sein, obwohl ich es noch nie geplant habe, um zu sehen, wie schnell es ist.
DisgruntledGoat

Es scheint, dass explode () etwas langsamer ist. In 10.000 Fällen ist dies die Zeit, die für beide benötigt wird. substr () zuerst: 0.013657 / 0.045038
Sampson

Könnte langsamer sein, aber ich bevorzuge die Explosion hier. Insbesondere wenn die URL kein "/" enthält, kann die +1 in der strrpos-Antwort dazu führen, dass ein Chaos explodiert.
Noam

1
Das Beispiel wirft einen Hinweis und sollte auf jeden Fall überarbeitet werden.
Xatenev

Ja, explodierte Daten müssen eine Variable sein
ymakux

11

Sie können verwenden substrund strrchr:

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

Eher so: ltrim (strrchr ($ url, "/"), "/"); strchr gibt eine Zeichenfolge zurück, keine Zahl
Denis Chenu

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

3
Obwohl das Endergebnis das gleiche ist wie das veröffentlichte, ermöglicht meine Version OP, die anderen Elemente der aufgeteilten Zeichenfolge zu verwenden, wenn er dies wünscht.
Ghostdog74

Dies ist die richtige Antwort, da der Titel nach 'last' / in url fragt
Fabiano Shark

1

array_pop(explode("/", "http://vimeo.com/1234567")); gibt das letzte Element der Beispiel-URL zurück


in php7 Rückmeldung : PHP Notice: Only variables should be passed by reference.
Billynoah

0

Zwei Einzeiler - ich vermute , die erste ist schneller , aber zweite ist schöner und im Gegensatz zu end()und array_pop()Sie das Ergebnis einer Funktion direkt passieren kann current()ohne Erzeugung Notiz oder eine Warnung , da es nicht den Zeiger nicht bewegt oder das Array ändern.

$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, Wenn Sie end()diesen Weg in PHP 5.4+ und höher verwenden, wird ein Hinweis ausgegeben. Laut docs: " Sie müssen eine echte Variable übergeben und keine Funktion, die ein Array zurückgibt, da nur tatsächliche Variablen als Referenz übergeben werden dürfen. "
Billynoah

-1

Hier ist eine schöne dynamische Funktion, die ich geschrieben habe, um den letzten Teil der URL oder des Pfads zu entfernen.

/**
 * 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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.